module CabalGild.Unstable.Action.StripBlanks where

import qualified Data.ByteString.Char8 as Latin1
import qualified Distribution.Fields as Fields

-- | High level wrapper around 'field' that makes this action easier to compose
-- with other actions.
run ::
  (Applicative m) =>
  ([Fields.Field a], cs) ->
  m ([Fields.Field a], cs)
run :: forall (m :: * -> *) a cs.
Applicative m =>
([Field a], cs) -> m ([Field a], cs)
run ([Field a]
fs, cs
cs) = ([Field a], cs) -> m ([Field a], cs)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Field a -> Field a) -> [Field a] -> [Field a]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Field a -> Field a
forall a. Field a -> Field a
field [Field a]
fs, cs
cs)

-- | Strips blank space from the field recursively. In practice there should
-- not be any leading or trailing blank space to begin with. However the legacy
-- curly bracket syntax can introduce trailing blank space. For example with
-- @s { f : x }@ the field value will have a trailing space (@"x "@).
field :: Fields.Field a -> Fields.Field a
field :: forall a. Field a -> Field a
field Field a
f = case Field a
f of
  Fields.Field Name a
n [FieldLine a]
fls ->
    Name a -> [FieldLine a] -> Field a
forall ann. Name ann -> [FieldLine ann] -> Field ann
Fields.Field (Name a -> Name a
forall a. Name a -> Name a
name Name a
n) ((FieldLine a -> FieldLine a) -> [FieldLine a] -> [FieldLine a]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap FieldLine a -> FieldLine a
forall a. FieldLine a -> FieldLine a
fieldLine [FieldLine a]
fls)
  Fields.Section Name a
n [SectionArg a]
sas [Field a]
fs ->
    Name a -> [SectionArg a] -> [Field a] -> Field a
forall ann.
Name ann -> [SectionArg ann] -> [Field ann] -> Field ann
Fields.Section (Name a -> Name a
forall a. Name a -> Name a
name Name a
n) ((SectionArg a -> SectionArg a) -> [SectionArg a] -> [SectionArg a]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap SectionArg a -> SectionArg a
forall a. SectionArg a -> SectionArg a
sectionArg [SectionArg a]
sas) ((Field a -> Field a) -> [Field a] -> [Field a]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Field a -> Field a
forall a. Field a -> Field a
field [Field a]
fs)

-- | Strips blank space from the field's name.
name :: Fields.Name a -> Fields.Name a
name :: forall a. Name a -> Name a
name (Fields.Name a
a FieldName
bs) = a -> FieldName -> Name a
forall ann. ann -> FieldName -> Name ann
Fields.Name a
a (FieldName -> FieldName
Latin1.strip FieldName
bs)

-- | Strips blank space from the field line.
fieldLine :: Fields.FieldLine a -> Fields.FieldLine a
fieldLine :: forall a. FieldLine a -> FieldLine a
fieldLine (Fields.FieldLine a
a FieldName
bs) = a -> FieldName -> FieldLine a
forall ann. ann -> FieldName -> FieldLine ann
Fields.FieldLine a
a (FieldName -> FieldName
Latin1.strip FieldName
bs)

-- | Strips blank space from the section argument.
sectionArg :: Fields.SectionArg a -> Fields.SectionArg a
sectionArg :: forall a. SectionArg a -> SectionArg a
sectionArg SectionArg a
sa = case SectionArg a
sa of
  Fields.SecArgName a
a FieldName
bs ->
    a -> FieldName -> SectionArg a
forall ann. ann -> FieldName -> SectionArg ann
Fields.SecArgName a
a (FieldName -> FieldName
Latin1.strip FieldName
bs)
  Fields.SecArgStr a
a FieldName
bs ->
    a -> FieldName -> SectionArg a
forall ann. ann -> FieldName -> SectionArg ann
Fields.SecArgStr a
a (FieldName -> FieldName
Latin1.strip FieldName
bs)
  Fields.SecArgOther a
a FieldName
bs ->
    a -> FieldName -> SectionArg a
forall ann. ann -> FieldName -> SectionArg ann
Fields.SecArgOther a
a (FieldName -> FieldName
Latin1.strip FieldName
bs)