module Codec.EBML (
decodeWebM,
WebMDocument (..),
WebMCluster (..),
decodeEBMLDocument,
webmSchemas,
module Codec.EBML.Stream,
EBMLDocument (..),
EBMLElement (..),
EBMLValue (..),
EBMLElementHeader (..),
EBMLID (..),
EBMLSchema (..),
decodeEBMLFile,
decodeWebMFile,
prettyEBMLDocument,
EBMLSchemas,
compileSchemas,
getDocument,
getElementHeader,
getElementID,
getDataSize,
getElement,
) where
import Data.Binary.Get (runGetOrFail)
import Data.ByteString.Lazy qualified as LBS
import Data.Text (Text)
import Data.Text qualified as Text
import Codec.EBML.Element
import Codec.EBML.Get
import Codec.EBML.Header
import Codec.EBML.Pretty
import Codec.EBML.Schema
import Codec.EBML.Stream
import Codec.EBML.WebM
decodeWebM :: LBS.ByteString -> Either Text WebMDocument
decodeWebM :: ByteString -> Either Text WebMDocument
decodeWebM ByteString
lbs = EBMLDocument -> Either Text WebMDocument
decodeWebMDocument forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< [EBMLSchema] -> ByteString -> Either Text EBMLDocument
decodeEBMLDocument [EBMLSchema]
webmSchemas ByteString
lbs
webmSchemas :: [EBMLSchema]
webmSchemas :: [EBMLSchema]
webmSchemas = [EBMLSchema]
schemaHeader
decodeEBMLDocument :: [EBMLSchema] -> LBS.ByteString -> Either Text EBMLDocument
decodeEBMLDocument :: [EBMLSchema] -> ByteString -> Either Text EBMLDocument
decodeEBMLDocument [EBMLSchema]
schemas ByteString
lbs = case forall a.
Get a
-> ByteString
-> Either
(ByteString, ByteOffset, String) (ByteString, ByteOffset, a)
runGetOrFail (EBMLSchemas -> Get EBMLDocument
getDocument ([EBMLSchema] -> EBMLSchemas
compileSchemas [EBMLSchema]
schemas)) ByteString
lbs of
Left (ByteString
_, ByteOffset
_, String
err) -> forall a b. a -> Either a b
Left (String -> Text
Text.pack String
err)
Right (ByteString
"", ByteOffset
_, EBMLDocument
x) -> forall a b. b -> Either a b
Right EBMLDocument
x
Right (ByteString
_rest, ByteOffset
l, EBMLDocument
_) -> forall a b. a -> Either a b
Left (Text
"Left over data at " forall a. Semigroup a => a -> a -> a
<> String -> Text
Text.pack (forall a. Show a => a -> String
show ByteOffset
l))
decodeEBMLFile :: [EBMLSchema] -> FilePath -> IO (Either Text EBMLDocument)
decodeEBMLFile :: [EBMLSchema] -> String -> IO (Either Text EBMLDocument)
decodeEBMLFile [EBMLSchema]
schemas String
fp = [EBMLSchema] -> ByteString -> Either Text EBMLDocument
decodeEBMLDocument [EBMLSchema]
schemas forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IO ByteString
LBS.readFile String
fp
decodeWebMFile :: FilePath -> IO (Either Text WebMDocument)
decodeWebMFile :: String -> IO (Either Text WebMDocument)
decodeWebMFile String
fp = do
Either Text EBMLDocument
ebml <- [EBMLSchema] -> String -> IO (Either Text EBMLDocument)
decodeEBMLFile [EBMLSchema]
webmSchemas String
fp
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ EBMLDocument -> Either Text WebMDocument
decodeWebMDocument forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Either Text EBMLDocument
ebml