librarian-0.1.0.1: app/Convert.hs
{-# LANGUAGE OverloadedRecordDot #-}
module Convert (convert) where
import Data.Foldable (Foldable (foldl'))
import Data.Time (UTCTime)
import qualified DhallTypes as S
import qualified Librarian as T
convert :: S.Rule -> T.Rule
convert x =
T.Rule
{ name = T.RuleName x.name.getRuleName,
match = T.Matcher x.match.matchPattern,
grouping = convertGrouping x.grouping,
filtering = convertFiltering x.filtering,
actions = convertAction <$> x.actions
}
convertGrouping :: S.Grouping -> T.Grouping
convertGrouping =
\case
S.FileGroup -> T.FileGroup
S.GroupTemporally source bucket selection ->
T.Group
{ groupSource = convertSourceTemporal source,
groupBucket = convertGroupingBucketTemporal bucket,
groupSelection = convertGroupSelectionTemporal selection
}
convertFiltering :: S.Filtering -> T.Filtering
convertFiltering =
\case
S.All -> T.AllF
S.Ands xs -> foldl' T.AndF T.AllF $ map convertFilteringCondition xs
S.Ors xs -> foldl' T.OrF T.AllF $ map convertFilteringCondition xs
where
convertFilteringCondition =
\case
S.GtTemporalF x y -> T.GtF (convertSourceTemporal x) (convertSourceTemporal y)
S.LtTemporalF x y -> T.LtF (convertSourceTemporal x) (convertSourceTemporal y)
convertAction :: S.Action -> T.Action
convertAction =
\case
S.Move {..} -> T.Move {inputPattern = inputPattern, newName = newName}
S.Copy {..} -> T.Copy {inputPattern = inputPattern, newName = newName}
S.Remove {..} -> T.Remove {inputPattern = inputPattern}
convertSourceTemporal :: S.SourceTemporal -> T.Source UTCTime
convertSourceTemporal =
\case
S.SourceDate x -> T.SourceDate $ convertSourceDate x
S.SourceTime x -> T.SourceTime $ convertTimeSpec x
convertGroupingBucketTemporal :: S.GroupingBucketTemporal -> T.GroupingBucket UTCTime
convertGroupingBucketTemporal =
\case
S.Daily -> T.Daily
S.Weekly -> T.Weekly
S.Monthly -> T.Monthly
convertGroupSelectionTemporal :: S.GroupSelectionTemporal -> T.GroupSelection UTCTime
convertGroupSelectionTemporal =
\case
S.AfterTemporal index sortingOrder source ->
T.After index (convertSortingOrder sortingOrder) (convertSourceTemporal source)
S.BeforeTemporal index sortingOrder source ->
T.Before index (convertSortingOrder sortingOrder) (convertSourceTemporal source)
where
convertSortingOrder =
\case
S.SortingAsc -> T.SortingAsc
S.SortingDesc -> T.SortingDesc
convertSourceDate :: S.SourceDate -> T.SourceDate
convertSourceDate =
\case
S.ModificationTime -> T.ModificationTime
S.AccessTime -> T.AccessTime
convertTimeSpec :: S.TimeSpec -> T.TimeSpec
convertTimeSpec =
\case
S.HoursAgo x -> T.HoursAgo x
S.DaysAgo x -> T.DaysAgo x
S.AbsoluteTime x -> T.AbsoluteTime x