module ID3.Parser.Tag (parseTag, parseTag_) where
import Data.Accessor
import ID3.Parser.Header
import ID3.Parser.ExtHeader
import ID3.Parser.Frame
import ID3.Parser.General
import ID3.Type
parseTag :: TagParser ID3Tag
parseTag = do
h <- parseHeader `err` "header"
parseTag_ h
parseTag_ :: ID3Header -> TagParser ID3Tag
parseTag_ h = do
tagVersionSet (h^.tagVersion)
flagsSet (h^.tagFlags)
ext <- if (h^.tagFlags^.extended)
then parseExtHeader >>= return . Just
else return Nothing `err` "ext header"
(idList, fs) <- parseFrames `err` "frames"
if (h^.tagFlags^.footed) then parseFooter else return h `err` "footer"
return $ initID3Tag [header^=h, extHeader^=ext, frames^=fs, framesOrder^=idList, padding^=(h^.tagSize) (framesSize fs)]