{-# LANGUAGE OverloadedLists #-}
module JsonLogic.Operation.Data (dataOperations, var, missing, missingSome, preserve) where
import Data.Maybe
import JsonLogic.Json
import JsonLogic.Operation.Primitive
import JsonLogic.Operation.Utils
import JsonLogic.Type
dataOperations :: Monad m => Operations m
dataOperations :: Operations m
dataOperations = [Item (Operations m)
forall (m :: * -> *). Monad m => Operation m
var, Item (Operations m)
forall (m :: * -> *). Monad m => Operation m
missing, Item (Operations m)
forall (m :: * -> *). Monad m => Operation m
missingSome, Item (Operations m)
forall (m :: * -> *). Monad m => Operation m
preserve]
var, missing, missingSome :: Monad m => Operation m
var :: Operation m
var = ([Char]
"var", Function m Json
forall (m :: * -> *). Monad m => Function m Json
evaluateVar)
missing :: Operation m
missing = ([Char]
"missing", Function m Json
forall (m :: * -> *). Monad m => Function m Json
evaluateMissing)
missingSome :: Operation m
missingSome = ([Char]
"missing_some", Function m Json
forall (m :: * -> *). Monad m => Function m Json
evaluateMissingSome)
preserve :: Monad m => Operation m
preserve :: Operation m
preserve = ([Char]
"preserve", \SubEvaluator m
_ Json
rule Json
_ -> Json -> ExceptT Exception m Json
forall (m :: * -> *) a. Monad m => a -> m a
return Json
rule)
evaluateVar :: Monad m => Function m Json
evaluateVar :: Function m Json
evaluateVar SubEvaluator m
evaluator Json
param Json
vars = do
Json
res <- SubEvaluator m
evaluator Json
param Json
vars
let (Json
j, Json
def) = Json -> (Json, Json)
getJsonWithDefault Json
res
case Json
j of
i :: Json
i@(JsonNumber Double
_) -> Json -> Result m Json
forall (m :: * -> *) a. Monad m => a -> m a
return (Json -> Result m Json) -> Json -> Result m Json
forall a b. (a -> b) -> a -> b
$ Json -> Maybe Json -> Json
forall a. a -> Maybe a -> a
fromMaybe Json
def (Maybe Json -> Json) -> Maybe Json -> Json
forall a b. (a -> b) -> a -> b
$ Json -> Json -> Maybe Json
indexWithJson Json
i Json
vars
i :: Json
i@(JsonString [Char]
_) -> Json -> Result m Json
forall (m :: * -> *) a. Monad m => a -> m a
return (Json -> Result m Json) -> Json -> Result m Json
forall a b. (a -> b) -> a -> b
$ Json -> Maybe Json -> Json
forall a. a -> Maybe a -> a
fromMaybe Json
def (Maybe Json -> Json) -> Maybe Json -> Json
forall a b. (a -> b) -> a -> b
$ Json -> Json -> Maybe Json
indexWithJson Json
i Json
vars
Json
JsonNull -> Json -> Result m Json
forall (m :: * -> *) a. Monad m => a -> m a
return Json
vars
JsonArray [] -> Json -> Result m Json
forall (m :: * -> *) a. Monad m => a -> m a
return Json
vars
Json
_ -> Json -> Result m Json
forall (m :: * -> *) a. Monad m => a -> m a
return Json
def
getJsonWithDefault :: Json -> (Json, Json)
getJsonWithDefault :: Json -> (Json, Json)
getJsonWithDefault (JsonArray (Json
x : Json
y : [Json]
_)) = (Json
x, Json
y)
getJsonWithDefault Json
j = (Json
j, Json
JsonNull)
evaluateMissing :: Monad m => Function m Json
evaluateMissing :: Function m Json
evaluateMissing SubEvaluator m
evaluator Json
keys' Json
vars = do
Json
keys <- SubEvaluator m
evaluator Json
keys' Json
vars
Json -> Result m Json
forall (m :: * -> *) a. Monad m => a -> m a
return (Json -> Result m Json)
-> ([Json] -> Json) -> [Json] -> Result m Json
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Json] -> Json
JsonArray ([Json] -> Result m Json) -> [Json] -> Result m Json
forall a b. (a -> b) -> a -> b
$ Json -> Json -> [Json]
missingKeys Json
keys Json
vars
evaluateMissingSome :: Monad m => Function m Json
evaluateMissingSome :: Function m Json
evaluateMissingSome SubEvaluator m
evaluator (JsonArray [Item [Json]
minKeys', Item [Json]
keys']) Json
vars = do
Int
minKeys <- Function m Int
forall (m :: * -> *). Monad m => Function m Int
evaluateInt SubEvaluator m
evaluator Item [Json]
Json
minKeys' Json
vars
Json
keys <- SubEvaluator m
evaluator Item [Json]
Json
keys' Json
vars
let miss :: [Json]
miss = Json -> Json -> [Json]
missingKeys Json
keys Json
vars
case Json
keys of
JsonArray [Json]
js | [Json] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Json]
js Int -> Int -> Int
forall a. Num a => a -> a -> a
- [Json] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Json]
miss Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
minKeys -> Json -> Result m Json
forall (m :: * -> *) a. Monad m => a -> m a
return (Json -> Result m Json) -> Json -> Result m Json
forall a b. (a -> b) -> a -> b
$ [Json] -> Json
JsonArray []
JsonArray [Json]
_ -> Json -> Result m Json
forall (m :: * -> *) a. Monad m => a -> m a
return (Json -> Result m Json) -> Json -> Result m Json
forall a b. (a -> b) -> a -> b
$ [Json] -> Json
JsonArray [Json]
miss
Json
_ | Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
- [Json] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Json]
miss Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
minKeys -> Json -> Result m Json
forall (m :: * -> *) a. Monad m => a -> m a
return (Json -> Result m Json) -> Json -> Result m Json
forall a b. (a -> b) -> a -> b
$ [Json] -> Json
JsonArray []
Json
_ -> Json -> Result m Json
forall (m :: * -> *) a. Monad m => a -> m a
return (Json -> Result m Json) -> Json -> Result m Json
forall a b. (a -> b) -> a -> b
$ [Json] -> Json
JsonArray [Json]
miss
evaluateMissingSome SubEvaluator m
_ Json
json Json
_ = [Char] -> Result m Json
forall (m :: * -> *) a. Monad m => [Char] -> Result m a
throw ([Char] -> Result m Json) -> [Char] -> Result m Json
forall a b. (a -> b) -> a -> b
$ [Char]
"Error: missing_some expects an array of two arguments, instead it got: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Json -> [Char]
forall a. Show a => a -> [Char]
show Json
json
missingKeys :: Json -> Data -> [Json]
missingKeys :: Json -> Json -> [Json]
missingKeys Json
keys Json
vars = [Json
key | Json
key <- Json -> [Json]
getKeys Json
keys, Maybe Json -> Bool
forall a. Maybe a -> Bool
isNothing (Maybe Json -> Bool) -> Maybe Json -> Bool
forall a b. (a -> b) -> a -> b
$ Json -> Json -> Maybe Json
indexWithJson Json
key Json
vars]
where
getKeys :: Json -> [Json]
getKeys :: Json -> [Json]
getKeys (JsonArray (arr :: Json
arr@(JsonArray [Json]
_) : [Json]
_)) = Json -> [Json]
getKeys Json
arr
getKeys (JsonArray [Json]
js) = [Json]
js
getKeys Json
j = [Item [Json]
Json
j]