packages feed

babynf-0.1.0.2: lib/Data/BAByNF/ABNF/Rules/CaseInsensitiveString.hs

module Data.BAByNF.ABNF.Rules.CaseInsensitiveString
    ( ref
    , rule
    , fromTree
    ) where

import Data.List qualified as List
import Data.Functor ( (<&>) )

import Data.BAByNF.Core.Tree (Tree)
import Data.BAByNF.Core.Tree qualified as Tree
import Data.BAByNF.Util.Ascii qualified as Ascii
import Data.BAByNF.ABNF.Rules.QuotedString qualified as QuotedString
import Data.BAByNF.ABNF.Model qualified as Model

ref :: Model.Rulename
ref = Model.Rulename (Ascii.stringAsBytesUnsafe "case-insensitive-string")

rule :: Model.Rule
rule = Model.Rule ref Model.BasicDefinition
    . Model.Elements
    . Model.Alternation
    . List.singleton
    . Model.Concatenation
    $
        [ Model.Repetition Model.NoRepeat
            . Model.OptionElement
            . Model.Option
            . Model.Alternation
            . List.singleton
            . Model.Concatenation
            . List.singleton
            . Model.Repetition Model.NoRepeat
            . Model.CharValElement
            . Model.CaseInsensitiveCharVal
            . Model.CaseInsensitiveString
            . Model.QuotedString
            $ Ascii.stringAsBytesUnsafe "%i"
        , Model.Repetition Model.NoRepeat
            . Model.RulenameElement
            $ QuotedString.ref
        ]

fromTree :: Tree Model.Rulename -> Either String Model.CaseInsensitiveString
fromTree tree = maybe (Left "no quoted-string") 
    QuotedString.fromTree (Tree.getChildWithRef QuotedString.ref tree) 
    <&> Model.CaseInsensitiveString