{-# LANGUAGE NoFieldSelectors #-} module Elmental.ElmStructure where import Data.Text (Text) {- | Contains the mapping of Haskell type constructor to an Elm type constructor, and potentially the location of its encoder / decoder. -} data ElmMapping = ElmMapping { typeName :: TypeName -- ^ Name of the corresponding Elm datatype. , moduleName :: Maybe ModuleName -- ^ Name of the module this type should be imported from / generated in. -- -- Can be set to @Nothing@ for core Elm types (@List@, @Bool@, @String@, ...) -- which don't require explicit imports. , encoderLocation :: Maybe SymbolLocation -- ^ Location of the encoder for this type. -- -- Must be set if you want to generate it, or to generate encoders depending on it. , decoderLocation :: Maybe SymbolLocation -- ^ Location of the decoder for this type. -- -- Must be set if you want to generate it, or to generate encoders depending on it. , args :: [ElmMapping] -- ^ Arguments supplied to the type constructor. , isTypeAlias :: Bool -- ^ Indicates whether the generated Elm datataype should be a type alias , urlPiece :: Maybe SymbolLocation -- ^ Location of the URL piece builder / parser for this type. , queryParam :: Maybe SymbolLocation -- ^ Location of the query param builder / parser for this type. } deriving (Eq, Show, Ord) type ModuleName = Text type SymbolName = Text type TypeName = Text type ConstructorName = Text type FieldName = Text type VarName = Text -- | Location of an Elm value (symbol / module name). data SymbolLocation = SymbolLocation { symbolName :: SymbolName , symbolModuleName :: ModuleName } deriving (Eq, Show, Ord) data TyCon = TyMapping ElmMapping | TyVar VarName deriving (Eq, Show, Ord) data TyRef = TyRef { tyCon :: TyCon , tyArgs :: [TyRef] } deriving (Eq, Show, Ord) data DatatypeStructure a = DatatypeStructure { mapping :: ElmMapping , nParams :: Integer , constructors :: [Constructor] } deriving (Eq, Show, Ord) type ElmField = (Maybe FieldName, TyRef) data Constructor = Constructor { constructorName :: ConstructorName , constructorFields :: [ElmField] } deriving (Eq, Show, Ord)