A Haskell implementation of Katydid.
This includes:
Documentation for katydid-haskell
Documentation for katydid-haskell/Relapse
All JSON and XML tests from the language agnostic test suite [passes].
Validating a single structure can be done using the validate function:
validate :: Tree t => Grammar -> [t] -> Bool
, where a tree is a class in the Parsers module:
class Tree a where
getLabel :: a -> Label
getChildren :: a -> [a]
Here is an example that validates a single JSON tree:
main = either
(\err -> putStrLn $ "error:" ++ err)
(\valid -> if valid
then putStrLn "dragons exist"
else putStrLn "dragons are fictional"
) $
Relapse.validate <$>
Relapse.parse ".DragonsExist == true" <*>
Json.decodeJSON "{\"DragonsExist\": false}"
If you want to validate multiple trees using the same grammar then the filter function does some internal memoization, which makes a huge difference.
filter :: Tree t => Grammar -> [[t]] -> [[t]]
If you want to create your own extra functions for operating on the leaves, then you can inject them into the parse function:
main = either
(\err -> putStrLn $ "error:" ++ err)
(\valid -> if valid
then putStrLn "prime birthday !!!"
else putStrLn "JOMO"
) $
Relapse.validate <$>
Relapse.parseWithUDFs userLib ".Survived->isPrime($int)" <*>
Json.decodeJSON "{\"Survived\": 104743}"
Defining your own user library to inject is easy.
The Expr
library provides many useful helper functions:
import Data.Numbers.Primes (isPrime)
import Data.Katydid.Relapse.Expr
userLib :: String -> [AnyExpr] -> Either String AnyExpr
userLib "isPrime" args = mkIsPrime args
userLib n _ = throwError $ "undefined function: " ++ n
mkIsPrime :: [AnyExpr] -> Either String AnyExpr
mkIsPrime args = do {
arg <- assertArgs1 "isPrime" args;
mkBoolExpr . isPrimeExpr <$> assertInt arg;
}
isPrimeExpr :: Integral a => Expr a -> Expr Bool
isPrimeExpr numExpr = trimBool Expr {
desc = mkDesc "isPrime" [desc numExpr]
, eval = \fieldValue -> isPrime <$> eval numExpr fieldValue
}
- Protobuf parser
- Profile and Optimize (bring up to par with Go version)
- Typed DSL (Combinator)