{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE NoImplicitPrelude #-}
module FilePaths
    ( module X
    ) where

import           Data.Bool       (not, (&&))
import           Data.Eq         ((/=), (==))
import           Data.List       (isInfixOf, null)
import           Data.Maybe
import qualified System.FilePath as FilePath

import           Data.Validity

import           Path            as X
import           Path.Internal
import           Path.IO         as X

instance Validity (Path Abs File) where
  isValid p@(Path fp)
    =  FilePath.isAbsolute fp
    && not (FilePath.hasTrailingPathSeparator fp)
    && FilePath.isValid fp
    && not (".." `isInfixOf` fp)
    && (parseAbsFile fp == Just p)

instance Validity (Path Rel File) where
  isValid p@(Path fp)
    =  FilePath.isRelative fp
    && not (FilePath.hasTrailingPathSeparator fp)
    && FilePath.isValid fp
    && fp /= "."
    && fp /= ".."
    && not (".." `isInfixOf` fp)
    && (parseRelFile fp == Just p)

instance Validity (Path Abs Dir) where
  isValid p@(Path fp)
    =  FilePath.isAbsolute fp
    && FilePath.hasTrailingPathSeparator fp
    && FilePath.isValid fp
    && not (".." `isInfixOf` fp)
    && (parseAbsDir fp == Just p)

instance Validity (Path Rel Dir) where
  isValid p@(Path fp)
    =  FilePath.isRelative fp
    && FilePath.hasTrailingPathSeparator fp
    && FilePath.isValid fp
    && not (null fp)
    && fp /= "."
    && fp /= ".."
    && not (".." `isInfixOf` fp)
    && (parseRelDir fp == Just p)