packages feed

argo-0.2022.2.2: source/library/Argo/Schema/Schema.hs

{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveLift #-}

module Argo.Schema.Schema where

import qualified Argo.Json.Array as Array
import qualified Argo.Json.Boolean as Boolean
import qualified Argo.Json.Member as Member
import qualified Argo.Json.Name as Name
import qualified Argo.Json.Object as Object
import qualified Argo.Json.String as String
import qualified Argo.Json.Value as Value
import qualified Argo.Schema.Identifier as Identifier
import qualified Argo.Vendor.DeepSeq as DeepSeq
import qualified Argo.Vendor.TemplateHaskell as TH
import qualified Argo.Vendor.Text as Text
import qualified GHC.Generics as Generics

-- | A JSON Schema.
-- <https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-01>
newtype Schema
    = Schema Value.Value
    deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)

instance Semigroup Schema where
    x <> y = fromValue . Value.Object $ Object.fromList
        [ Member.fromTuple
              ( Name.fromString . String.fromText $ Text.pack "oneOf"
              , Value.Array $ Array.fromList [toValue x, toValue y]
              )
        ]

instance Monoid Schema where
    mempty = true

fromValue :: Value.Value -> Schema
fromValue = Schema

toValue :: Schema -> Value.Value
toValue (Schema x) = x

false :: Schema
false = fromValue . Value.Boolean $ Boolean.fromBool False

true :: Schema
true = fromValue . Value.Boolean $ Boolean.fromBool True

unidentified :: Schema -> (Maybe Identifier.Identifier, Schema)
unidentified s = (Nothing, s)

identified
    :: Identifier.Identifier -> Schema -> (Maybe Identifier.Identifier, Schema)
identified i s = (Just i, s)