packages feed

ebml-0.1.0.0: src/Codec/EBML/Schema.hs

module Codec.EBML.Schema where

import Data.Binary.Get (Get)
import Data.Map.Strict (Map)
import Data.Map.Strict qualified as Map
import Data.Text (Text)

import Codec.EBML.Element

{- | EBML schema definition.

Note that this is missing:

- min/max occurrence constraint.
- default value.
- element path.
-}
data EBMLSchema = EBMLSchema
    { name :: Text
    -- ^ The element name.
    , eid :: EBMLID
    -- ^ The element id.
    , decode :: EBMLSchemas -> EBMLElementHeader -> Get EBMLValue
    -- ^ How to decode the element value.
    }

newtype EBMLSchemas = EBMLSchemas (Map EBMLID EBMLSchema)

-- | Combine a list of schema for decoder.
compileSchemas :: [EBMLSchema] -> EBMLSchemas
compileSchemas = EBMLSchemas . Map.fromList . map toKV
  where
    toKV schema = (schema.eid, schema)

lookupSchema :: EBMLID -> EBMLSchemas -> Maybe EBMLSchema
lookupSchema eid (EBMLSchemas schemas) = Map.lookup eid schemas