Safe Haskell | None |
---|---|
Language | GHC2021 |
Codec.CBOR.Cuddle.CBOR.Validator
Synopsis
- type CDDL = CTreeRoot' Identity MonoRef
- type Rule = Node MonoRef
- type ResolvedRule = CTree MonoRef
- data CBORTermResult = CBORTermResult Term CDDLResult
- data CDDLResult
- = Valid Rule
- | ChoiceFail Rule (NonEmpty Rule) (NonEmpty (Rule, CDDLResult))
- | ListExpansionFail Rule [[Rule]] [[(Rule, CBORTermResult)]]
- | MapExpansionFail Rule [[Rule]] [([AMatchedItem], ANonMatchedItem)]
- | InvalidControl Rule (Maybe CBORTermResult)
- | InvalidRule Rule
- | InvalidTagged Rule (Either Word64 CBORTermResult)
- | UnapplicableRule Rule
- data ANonMatchedItem = ANonMatchedItem {
- anmiKey :: Term
- anmiValue :: Term
- anmiResults :: [Either (Rule, CDDLResult) (Rule, CDDLResult, CDDLResult)]
- data AMatchedItem = AMatchedItem {}
- validateCBOR :: ByteString -> Name -> CDDL -> IO ()
- validateCBOR' :: ByteString -> Name -> CDDL -> CBORTermResult
- validateTerm :: MonadReader CDDL m => Term -> Rule -> m CBORTermResult
- validateInteger :: MonadReader CDDL m => Integer -> Rule -> m CDDLResult
- controlInteger :: MonadReader CDDL m => Integer -> CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ())
- validateHalf :: MonadReader CDDL m => Float -> Rule -> m CDDLResult
- controlHalf :: MonadReader CDDL m => Float -> CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ())
- validateFloat :: MonadReader CDDL m => Float -> Rule -> m CDDLResult
- controlFloat :: MonadReader CDDL m => Float -> CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ())
- validateDouble :: MonadReader CDDL m => Double -> Rule -> m CDDLResult
- controlDouble :: MonadReader CDDL m => Double -> CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ())
- validateBool :: MonadReader CDDL m => Bool -> Rule -> m CDDLResult
- controlBool :: MonadReader CDDL m => Bool -> CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ())
- validateSimple :: MonadReader CDDL m => Word8 -> Rule -> m CDDLResult
- validateNull :: MonadReader CDDL m => Rule -> m CDDLResult
- validateBytes :: MonadReader CDDL m => ByteString -> Rule -> m CDDLResult
- controlBytes :: MonadReader CDDL m => ByteString -> CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ())
- validateText :: MonadReader CDDL m => Text -> Rule -> m CDDLResult
- controlText :: MonadReader CDDL m => Text -> CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ())
- validateTagged :: MonadReader CDDL m => Word64 -> Term -> Rule -> m CDDLResult
- flattenGroup :: CDDL -> [Rule] -> [Rule]
- expandRules :: Int -> [Rule] -> Reader CDDL [[Rule]]
- expandRule :: Int -> Rule -> Reader CDDL [[Rule]]
- isOptional :: MonadReader CDDL m => Rule -> m Bool
- validateListWithExpandedRules :: MonadReader CDDL m => [Term] -> [Rule] -> m [(Rule, CBORTermResult)]
- validateExpandedList :: MonadReader CDDL m => [Term] -> [[Rule]] -> m (Rule -> CDDLResult)
- validateList :: MonadReader CDDL m => [Term] -> Rule -> m CDDLResult
- validateMapWithExpandedRules :: MonadReader CDDL m => [(Term, Term)] -> [Rule] -> m ([AMatchedItem], Maybe ANonMatchedItem)
- validateExpandedMap :: MonadReader CDDL m => [(Term, Term)] -> [[Rule]] -> m (Rule -> CDDLResult)
- validateMap :: MonadReader CDDL m => [(Term, Term)] -> Rule -> m CDDLResult
- validateChoice :: Monad m => (Rule -> m CDDLResult) -> NonEmpty Rule -> m (Rule -> CDDLResult)
- dummyRule :: Rule
- ctrlAnd :: Monad m => (Rule -> m CDDLResult) -> Rule -> Rule -> m (Rule -> CDDLResult)
- ctrlDispatch :: Monad m => (Rule -> m CDDLResult) -> CtlOp -> Rule -> Rule -> (CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ())) -> m (Rule -> CDDLResult)
- boolCtrl :: Bool -> Either (Maybe CBORTermResult) ()
- getIndicesOfChoice :: MonadReader CDDL m => NonEmpty Rule -> m [Word64]
- getIndicesOfRange :: MonadReader CDDL m => Rule -> Rule -> RangeBound -> m [Word64]
- getIndicesOfEnum :: MonadReader CDDL m => Rule -> m [Word64]
- resolveIfRef :: CDDL -> Rule -> ResolvedRule
- getRule :: MonadReader CDDL m => Rule -> m ResolvedRule
- replaceRule :: CDDLResult -> Rule -> CDDLResult
- ifM :: Monad m => m Bool -> m a -> m a -> m a
- check :: Bool -> Rule -> CDDLResult
- range :: Ord a => RangeBound -> a -> a -> Bool
Documentation
type ResolvedRule = CTree MonoRef Source #
data CBORTermResult Source #
Constructors
CBORTermResult Term CDDLResult |
Instances
Show CBORTermResult Source # | |
Defined in Codec.CBOR.Cuddle.CBOR.Validator Methods showsPrec :: Int -> CBORTermResult -> ShowS # show :: CBORTermResult -> String # showList :: [CBORTermResult] -> ShowS # |
data CDDLResult Source #
Constructors
Valid Rule | The rule was valid |
ChoiceFail | All alternatives failed |
ListExpansionFail | All expansions failed An expansion is: Given a CBOR |
Fields
| |
MapExpansionFail | All expansions failed An expansion is: Given a CBOR |
Fields
| |
InvalidControl | The rule was valid but the control failed |
Fields
| |
InvalidRule Rule | |
InvalidTagged | A tagged was invalid |
Fields
| |
UnapplicableRule | The rule we are trying is not applicable to the CBOR term |
Fields
|
Instances
Show CDDLResult Source # | |
Defined in Codec.CBOR.Cuddle.CBOR.Validator Methods showsPrec :: Int -> CDDLResult -> ShowS # show :: CDDLResult -> String # showList :: [CDDLResult] -> ShowS # |
data ANonMatchedItem Source #
Constructors
ANonMatchedItem | |
Fields
|
Instances
Show ANonMatchedItem Source # | |
Defined in Codec.CBOR.Cuddle.CBOR.Validator Methods showsPrec :: Int -> ANonMatchedItem -> ShowS # show :: ANonMatchedItem -> String # showList :: [ANonMatchedItem] -> ShowS # |
data AMatchedItem Source #
Instances
Show AMatchedItem Source # | |
Defined in Codec.CBOR.Cuddle.CBOR.Validator Methods showsPrec :: Int -> AMatchedItem -> ShowS # show :: AMatchedItem -> String # showList :: [AMatchedItem] -> ShowS # |
validateCBOR :: ByteString -> Name -> CDDL -> IO () Source #
validateCBOR' :: ByteString -> Name -> CDDL -> CBORTermResult Source #
validateTerm :: MonadReader CDDL m => Term -> Rule -> m CBORTermResult Source #
Core function that validates a CBOR term to a particular rule of the CDDL spec
validateInteger :: MonadReader CDDL m => Integer -> Rule -> m CDDLResult Source #
Validation of an Int or Integer. CBOR categorizes every integral in TInt
or TInteger
but it can be the case that we are decoding something that is
expected to be a Word64
even if we get a TInt
.
ghci> encodeWord64 15 [TkInt 15] ghci> encodeWord64 maxBound [TkInteger 18446744073709551615]
For this reason, we cannot assume that bounds or literals are going to be Ints, so we convert everything to Integer.
controlInteger :: MonadReader CDDL m => Integer -> CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ()) Source #
Controls for an Integer
validateHalf :: MonadReader CDDL m => Float -> Rule -> m CDDLResult Source #
Validating a Float16
controlHalf :: MonadReader CDDL m => Float -> CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ()) Source #
Controls for Float16
validateFloat :: MonadReader CDDL m => Float -> Rule -> m CDDLResult Source #
Validating a Float32
controlFloat :: MonadReader CDDL m => Float -> CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ()) Source #
Controls for Float32
validateDouble :: MonadReader CDDL m => Double -> Rule -> m CDDLResult Source #
Validating a Float64
controlDouble :: MonadReader CDDL m => Double -> CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ()) Source #
Controls for Float64
validateBool :: MonadReader CDDL m => Bool -> Rule -> m CDDLResult Source #
Validating a boolean
controlBool :: MonadReader CDDL m => Bool -> CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ()) Source #
Controls for Bool
validateSimple :: MonadReader CDDL m => Word8 -> Rule -> m CDDLResult Source #
Validating a TSimple
. It is unclear if this is used for anything else than undefined.
validateNull :: MonadReader CDDL m => Rule -> m CDDLResult Source #
Validating nil
validateBytes :: MonadReader CDDL m => ByteString -> Rule -> m CDDLResult Source #
Validating a byte sequence
controlBytes :: MonadReader CDDL m => ByteString -> CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ()) Source #
Controls for byte strings
validateText :: MonadReader CDDL m => Text -> Rule -> m CDDLResult Source #
Validating text strings
controlText :: MonadReader CDDL m => Text -> CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ()) Source #
Controls for text strings
validateTagged :: MonadReader CDDL m => Word64 -> Term -> Rule -> m CDDLResult Source #
Validating a TTagged
flattenGroup :: CDDL -> [Rule] -> [Rule] Source #
Groups might contain enums, or unwraps inside. This resolves all those to the top level of the group.
expandRules :: Int -> [Rule] -> Reader CDDL [[Rule]] Source #
Expand rules to reach exactly the wanted length, which must be the number of items in the container. For example, if we want to validate 3 elements, and we have the following CDDL:
a = [* int, * bool]
this will be expanded to `[int, int, int], [int, int, bool], [int, bool, bool], [bool, bool, bool]`.
Essentially the rules we will parse is the choice among the expansions of the original rules.
isOptional :: MonadReader CDDL m => Rule -> m Bool Source #
Which rules are optional?
validateListWithExpandedRules :: MonadReader CDDL m => [Term] -> [Rule] -> m [(Rule, CBORTermResult)] Source #
validateExpandedList :: MonadReader CDDL m => [Term] -> [[Rule]] -> m (Rule -> CDDLResult) Source #
validateList :: MonadReader CDDL m => [Term] -> Rule -> m CDDLResult Source #
validateMapWithExpandedRules :: MonadReader CDDL m => [(Term, Term)] -> [Rule] -> m ([AMatchedItem], Maybe ANonMatchedItem) Source #
validateExpandedMap :: MonadReader CDDL m => [(Term, Term)] -> [[Rule]] -> m (Rule -> CDDLResult) Source #
validateMap :: MonadReader CDDL m => [(Term, Term)] -> Rule -> m CDDLResult Source #
validateChoice :: Monad m => (Rule -> m CDDLResult) -> NonEmpty Rule -> m (Rule -> CDDLResult) Source #
ctrlAnd :: Monad m => (Rule -> m CDDLResult) -> Rule -> Rule -> m (Rule -> CDDLResult) Source #
Validate both rules
ctrlDispatch :: Monad m => (Rule -> m CDDLResult) -> CtlOp -> Rule -> Rule -> (CtlOp -> Rule -> m (Either (Maybe CBORTermResult) ())) -> m (Rule -> CDDLResult) Source #
Dispatch to the appropriate control
getIndicesOfChoice :: MonadReader CDDL m => NonEmpty Rule -> m [Word64] Source #
getIndicesOfRange :: MonadReader CDDL m => Rule -> Rule -> RangeBound -> m [Word64] Source #
getIndicesOfEnum :: MonadReader CDDL m => Rule -> m [Word64] Source #
resolveIfRef :: CDDL -> Rule -> ResolvedRule Source #
getRule :: MonadReader CDDL m => Rule -> m ResolvedRule Source #
replaceRule :: CDDLResult -> Rule -> CDDLResult Source #