module YamlUnscrambler.Err
(
  ErrAtPath(..),
  Err(..),
  atSegment,
  -- *
  MaxInputSize(..),
  Signed(..),
  NumeralSystem(..),
  CaseSensitive(..),
  -- * Reexports from \"libyaml\"
  Libyaml.Tag(..),
  Libyaml.Style(..),
)
where

import YamlUnscrambler.Prelude hiding (String)
import YamlUnscrambler.Model
import qualified YamlUnscrambler.Expectations as Ex
import qualified Text.Libyaml as Libyaml
import qualified Text.Builder as TextBuilder


data ErrAtPath =
  ErrAtPath [Text] Err

data Err =
  KeyErr
    Ex.String
    {-^ Key expectation. -}
    Text
    {-^ Key input. -}
    Text
    {-^ String parsing error. -}
    |
  NoneOfMappingKeysFoundErr
    (Ex.ByKey Text)
    CaseSensitive
    [Text]
    {-^ Available keys. -}
    [Text]
    {-^ Keys looked up. -}
    |
  NoneOfSequenceKeysFoundErr
    (Ex.ByKey Int)
    [Int]
    |
  ScalarErr
    [Ex.Scalar]
    {-^ Expected formats. -}
    ByteString
    {-^ Input. -}
    Libyaml.Tag
    {-^ Tag. -}
    Libyaml.Style
    {-^ Style. -}
    (Maybe Text)
    {-^ Last error. -}
    |
  UnexpectedScalarErr
    Ex.Value
    |
  UnexpectedMappingErr
    Ex.Value
    |
  UnexpectedSequenceErr
    Ex.Value
    |
  UnknownAnchorErr
    Text
    |
  NotEnoughElementsErr
    Ex.ByOrder
    Int

atSegment :: Text -> ErrAtPath -> ErrAtPath
atSegment :: Text -> ErrAtPath -> ErrAtPath
atSegment Text
seg (ErrAtPath [Text]
path Err
err) =
  [Text] -> Err -> ErrAtPath
ErrAtPath (Text
seg Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: [Text]
path) Err
err