module Debug.TraceEmbrace.Config.Validation where

import Data.Functor.Identity
import Refined


type family Columnar f r a where
  Columnar Identity r a = Refined r a
  Columnar Maybe _ a = Maybe a

mapLeft :: (a -> b) -> Either a c -> Either b c
mapLeft :: forall a b c. (a -> b) -> Either a c -> Either b c
mapLeft a -> b
f = \case
  Left a
x -> b -> Either b c
forall a b. a -> Either a b
Left (b -> Either b c) -> b -> Either b c
forall a b. (a -> b) -> a -> b
$ a -> b
f a
x
  Right c
o -> c -> Either b c
forall a b. b -> Either a b
Right c
o

refineS :: forall {k} (p :: k) x. Predicate p x => String -> x -> Either String (Refined p x)
refineS :: forall {k} (p :: k) x.
Predicate p x =>
String -> x -> Either String (Refined p x)
refineS String
fieldName =
  (RefineException -> String)
-> Either RefineException (Refined p x)
-> Either String (Refined p x)
forall a b c. (a -> b) -> Either a c -> Either b c
mapLeft (((String
"Field [" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
fieldName String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"] is not valid due: ") String -> String -> String
forall a. Semigroup a => a -> a -> a
<>) (String -> String)
-> (RefineException -> String) -> RefineException -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RefineException -> String
forall a. Show a => a -> String
show) (Either RefineException (Refined p x)
 -> Either String (Refined p x))
-> (x -> Either RefineException (Refined p x))
-> x
-> Either String (Refined p x)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. x -> Either RefineException (Refined p x)
forall {k} (p :: k) x.
Predicate p x =>
x -> Either RefineException (Refined p x)
refine

required :: forall {k} {p :: k} {a}. Predicate p a => String -> Maybe a -> Either String (Refined p a)
required :: forall {k} {p :: k} {a}.
Predicate p a =>
String -> Maybe a -> Either String (Refined p a)
required String
s Maybe a
v =
  (Either String a
-> (a -> Either String a) -> Maybe a -> Either String a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (String -> Either String a
forall a b. a -> Either a b
Left (String -> Either String a) -> String -> Either String a
forall a b. (a -> b) -> a -> b
$ String
"[" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
s String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"] field is required") a -> Either String a
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
v) Either String a
-> (a -> Either String (Refined p a))
-> Either String (Refined p a)
forall a b.
Either String a -> (a -> Either String b) -> Either String b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> a -> Either String (Refined p a)
forall {k} (p :: k) x.
Predicate p x =>
String -> x -> Either String (Refined p x)
refineS String
s

type SeparatorValidator = And (SizeLessThan 5) NonEmpty