packages feed

yaml-unscrambler-0.1.0.18: library/YamlUnscrambler/Expectations.hs

module YamlUnscrambler.Expectations
  ( Value (..),
    Scalar (..),
    Mapping (..),
    Sequence (..),
    String (..),
    ByKey (..),
    ByOrder (..),

    -- * --
    MaxInputSize (..),
    Signed (..),
    NumeralSystem (..),
    CaseSensitive (..),
  )
where

import YamlUnscrambler.Model
import YamlUnscrambler.Prelude hiding (String)
import qualified YamlUnscrambler.Util.Maybe as Maybe

-- * --

data Value
  = Value
      [Scalar]
      (Maybe Mapping)
      (Maybe Sequence)

data Scalar
  = StringScalar String
  | NullScalar
  | BoolScalar
  | ScientificScalar
  | DoubleScalar
  | RationalScalar MaxInputSize
  | BoundedIntegerScalar Signed NumeralSystem
  | UnboundedIntegerScalar MaxInputSize Signed NumeralSystem
  | Iso8601TimestampScalar
  | Iso8601DayScalar
  | Iso8601TimeScalar
  | UuidScalar
  | Base64BinaryScalar

data Mapping
  = MonomorphicMapping String Value
  | ByKeyMapping CaseSensitive (ByKey Text)

data Sequence
  = MonomorphicSequence Value
  | ByOrderSequence ByOrder
  | ByKeySequence (ByKey Int)

-- * --

data String
  = -- | Any string as it is.
    AnyString
  | -- | One of options. Suitable for enumerations.
    OneOfString
      CaseSensitive
      -- | Options.
      [Text]
  | -- | Must conform to a textually described format.
    FormattedString
      -- | Description of the format.
      Text

data ByKey key
  = AnyByKey
  | NoByKey
  | EitherByKey (ByKey key) (ByKey key)
  | BothByKey (ByKey key) (ByKey key)
  | LookupByKey
      -- | Keys to lookup.
      [key]
      Value

data ByOrder
  = AnyByOrder
  | BothByOrder ByOrder ByOrder
  | FetchByOrder Value

-- * --

instance Semigroup Value where
  (<>) (Value lScalars lMappings lSequences) (Value rScalars rMappings rSequences) =
    Value
      (lScalars <> rScalars)
      (Maybe.firstNonEmpty lMappings rMappings)
      (Maybe.firstNonEmpty lSequences rSequences)

instance Monoid Value where
  mempty =
    Value [] Nothing Nothing