packages feed

jsonlogic-0.1.0.0: src/JsonLogic/Operation/String.hs

{-# LANGUAGE OverloadedLists #-}

-- |
-- Module      : JsonLogic.Operation.String
-- Description : Internal JsonLogic operations on strings
-- Copyright   : (c) Marien Matser, Gerard van Schie, Jelle Teeuwissen, 2022
-- License     : MIT
-- Maintainer  : jelleteeuwissen@hotmail.nl
-- Stability   : experimental
module JsonLogic.Operation.String (stringOperations, cat, substr) where

import JsonLogic.Json
import JsonLogic.Operation.Primitive
import JsonLogic.Type

stringOperations :: Monad m => Operations m
stringOperations = [cat, substr]

-- String Operations
cat, substr :: Monad m => Operation m
cat = ("cat", evaluateCat)
substr = ("substr", evaluateSubstr)

evaluateCat :: Monad m => Function m Json
evaluateCat evaluator args vars = do
  res <- evaluator args vars
  case res of
    (JsonArray js) -> return $ JsonString $ foldMap stringify js
    json -> return $ JsonString $ stringify json

-- | Evaluate substr operation
evaluateSubstr :: Monad m => Function m Json
evaluateSubstr evaluator param vars = do
  res <- evaluator param vars
  JsonString <$> case res of
    -- Take everything from the index (can be negative)
    JsonArray [s, i] -> do
      str <- evaluateString evaluator s vars
      index <- evaluateInt evaluator i vars
      return $ alterSubstr drop index str
    -- Take a part of the substring between the two indexes
    JsonArray (s : startI : endI : _) -> do
      str <- evaluateString evaluator s vars
      startIndex <- evaluateInt evaluator startI vars
      endIndex <- evaluateInt evaluator endI vars
      return $ alterSubstr take endIndex $ alterSubstr drop startIndex str
    -- No proper indexing arguments given, return the full json string
    json -> evaluateString evaluator json vars
  where
    -- Takes part of the substring given a positive or negative index
    alterSubstr :: (Int -> String -> String) -> Int -> String -> String
    alterSubstr f index str
      | index >= 0 = f index str
      | otherwise = f (length str + index) str