Skip to content

Commit

Permalink
wip 2
Browse files Browse the repository at this point in the history
  • Loading branch information
AugmenTab committed Mar 14, 2024
1 parent 72f652f commit 5e9fa1d
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 1 deletion.
51 changes: 50 additions & 1 deletion json-fleece-codegen-util/src/Fleece/CodeGenUtil/HaskellCode.hs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ module Fleece.CodeGenUtil.HaskellCode
, renderText
, renderString
, newline
, taggedUnion
, typeList
, taggedUnionTypeList
, intercalate
, lines
, indent
Expand Down Expand Up @@ -62,16 +65,18 @@ module Fleece.CodeGenUtil.HaskellCode
, enumClass
, boundedClass
, preludeType
, shrubberyType
) where

-- import prelude explicitly since we want to define our own 'lines' function

import Data.Maybe (fromMaybe)
import Prelude (Eq ((==)), Foldable, Int, Maybe (Just, Nothing), Monoid (mempty), Ord, Semigroup ((<>)), String, any, flip, fmap, id, map, maybe, mconcat, show, zip, ($), (.))
import Prelude (Eq ((==)), Foldable, Int, Maybe (Just, Nothing), Monoid (mempty), Ord, Semigroup ((<>)), String, any, const, flip, fmap, id, map, maybe, mconcat, show, zip, ($), (.))

import qualified Data.Char as Char
import Data.Foldable (toList)
import qualified Data.List as List
import qualified Data.List.NonEmpty as NEL
import qualified Data.NonEmptyText as NET
import qualified Data.Set as Set
import qualified Data.String as String
Expand Down Expand Up @@ -409,6 +414,46 @@ deriving_ :: [TypeName] -> HaskellCode
deriving_ classes =
"deriving (" <> intercalate ", " (map (typeNameToCode Nothing) classes) <> ")"

taggedUnion :: TypeExpression -> TypeExpression
taggedUnion unionName =
typeNameToCodeDefaultQualification (shrubberyType "TaggedUnion")
<> " "
<> unionName

typeList :: TypeName -> NEL.NonEmpty TypeExpression -> HaskellCode
typeList =
prefixedTypeList Nothing

taggedUnionTypeList :: TypeName -> NEL.NonEmpty TypeExpression -> HaskellCode
taggedUnionTypeList =
prefixedTypeList (Just $ \member -> "\"" <> member <> "\" @= ")

prefixedTypeList ::
Maybe (HaskellCode -> HaskellCode) ->
TypeName ->
NEL.NonEmpty TypeExpression ->
HaskellCode
prefixedTypeList mbPrefixFn typeListName members =
let
first = toCode $ NEL.head members
rest = map toCode $ NEL.tail members
prefix =
case mbPrefixFn of
Just prefixFn -> prefixFn
Nothing -> const mempty

firstMember = "[ " <> prefix first <> first
restMembers = map (\member -> ", \"" <> member <> member) rest
in
lines
[ "type "
<> typeNameToCode Nothing typeListName
<> " ="
, indent 2 firstMember
, lines $ map (indent 2) restMembers
, indent 2 "]"
]

listOf :: TypeExpression -> TypeExpression
listOf itemName =
TypeExpression ("[" <> toCode itemName <> "]")
Expand Down Expand Up @@ -528,3 +573,7 @@ boundedClass =
preludeType :: T.Text -> TypeName
preludeType =
toTypeName "Prelude" Nothing

shrubberyType :: T.Text -> TypeName
shrubberyType =
toTypeName "Shrubbery" (Just "Shrubbery")
6 changes: 6 additions & 0 deletions json-fleece-openapi3/examples/one-of/one-of.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ build-type: Simple

library
exposed-modules:
<<<<<<< Updated upstream
OneOfTest.Operations.GetMultiplePathsParams
OneOfTest.Operations.GetMultiplePathsParams.Param1
OneOfTest.Operations.GetMultiplePathsParams.Param2
Expand Down Expand Up @@ -147,6 +148,11 @@ library
OneOfTest.Types.TopLevelArrayNullable.TopLevelArrayNullableItem
OneOfTest.Types.UtcTimeType
OneOfTest.Types.ZonedTimeType
=======
OneOfTest.Types.AStringType
OneOfTest.Types.Obj
OneOfTest.Types.Obj.Foobar
>>>>>>> Stashed changes
other-modules:
Paths_one_of
hs-source-dirs:
Expand Down
32 changes: 32 additions & 0 deletions json-fleece-openapi3/src/Fleece/OpenApi3.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
<<<<<<< Updated upstream
=======
{-# OPTIONS_GHC -Wwarn #-}
>>>>>>> Stashed changes

module Fleece.OpenApi3
( generateOpenApiFleeceCode
Expand Down Expand Up @@ -803,6 +807,7 @@ mkOpenApiDataFormat schemaKey typeName schema =
noRefs $ pure (CGU.nullFormat typeOptions)
Nothing ->
case OA._schemaOneOf schema of
<<<<<<< Updated upstream
Just schemas ->
mkOneOf schemas
Nothing ->
Expand All @@ -822,6 +827,33 @@ mkOneOf schemas =
oa
in do
(maps, dataFormats) <- fmap unzip . traverse mkCodeGenDataFormat $ mapMaybe mk schemas
=======
Just schemas -> mkOneOf schemas
Nothing -> mkOpenApiObjectFormatOrAdditionalPropertiesNewtype CGU.Type schemaKey typeName schema

mkOneOf ::
[OA.Referenced OA.Schema] ->
CGU.CodeGen (SchemaMap, CGU.CodeGenDataFormat)
mkOneOf schemas = do
let
mk :: OA.Referenced OA.Schema -> Maybe OA.Schema
mk schema =
case schema of
OA.Inline foo -> Just foo
OA.Ref ref -> Nothing -- TODO
mkCodeGenDataFormat ::
OA.Schema ->
CGU.CodeGen (SchemaMap, CGU.CodeGenDataFormat)
mkCodeGenDataFormat oa =
mkOpenApiDataFormat
"foobar" -- TODO
(HC.preludeType "Integer")
oa

(maps, dataFormats) <-
fmap unzip . traverse mkCodeGenDataFormat $ mapMaybe mk schemas

>>>>>>> Stashed changes
pure (Map.unions maps, CGU.CodeGenUnionMembers dataFormats)

mkOpenApiStringFormat :: HC.TypeName -> OA.Schema -> CGU.CodeGen CGU.CodeGenDataFormat
Expand Down

0 comments on commit 5e9fa1d

Please sign in to comment.