h$v      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~None -.3>? (servant-foreign"a static path segment. like "/foo"servant-foreigna capture. like "/:userid"tservant-foreignUtility class used by  which computes the data needed to generate a function for each endpoint and hands it all back in a list.|servant-foreign| maps Haskell types with types in the target language of your backend. For example, let's say you're implementing a backend to some language X, and you want a Text representation of each input/output type mentioned in the API: -- First you need to create a dummy type to parametrize your -- instances. data LangX -- Otherwise you define instances for the types you need instance HasForeignType LangX Text Int where typeFor _ _ _ = "intX" -- Or for example in case of lists instance HasForeignType LangX Text a => HasForeignType LangX Text [a] where typeFor lang type _ = "listX of " <> typeFor lang ftype (Proxy :: Proxy a)Finally to generate list of information about all the endpoints for an API you create a function of a form: getEndpoints :: (HasForeign LangX Text api, GenerateList Text (Foreign Text api)) => Proxy api -> [Req Text] getEndpoints api = listFromAPI (Proxy :: Proxy LangX) (Proxy :: Proxy Text) api -- If language __X__ is dynamically typed then you can use -- a predefined NoTypes parameter with the NoContent output type: getEndpoints :: (HasForeign NoTypes NoContent api, GenerateList Text (Foreign NoContent api)) => Proxy api -> [Req NoContent] getEndpoints api = listFromAPI (Proxy :: Proxy NoTypes) (Proxy :: Proxy NoContent) api servant-foreign8Generate the necessary data for codegen as a list, each ^/ describing one endpoint from your API type.servant-foreign*TODO: doesn't taking framing into account. #$%&'+,-./0157689=>@?ABCGIHKJLMQRSTWVUXYZ^_fedcba`gihjkltuvwxzy{|}~  '&#$%/01.+,-95768CBA=>@?MLGIHKJRQYXSTWVUZlkjgih^_fedcba`~|}{xzyvwtuNone gservant-foreign;Function name builder that simply concat each part togetherservant-foreignFunction name builder using the snake_case convention. each part is separated by a single underscore character.servant-foreignFunction name builder using the CamelCase convention. each part begins with an upper case character.None  #$%&'.015867=>?@ABCGHIJKLMQSTUVWXY^_`abcdefghikltuxyz{|}~5867GHIJK=>?@^_`abcdefghi#$%STUVW. ~klLMQXY&'ABCxyz|}tu{10       !"#$$%&'()*++,-./0123456789:;<<=>?@ABCDEEFGHIJKLMNOPPQRSTUVWXYZZ[\]^_`abcdefghijklmnopqqrstuvwxyz{|}~-servant-foreign-0.15.3-2TFvpSiiy9z7uHGbBPgcQ3Servant.Foreign.InternalServant.Foreign.InflectionsServant.Foreign FunctionNameunFunctionName$fDataFunctionName$fShowFunctionName$fEqFunctionName$fSemigroupFunctionName$fMonoidFunctionName PathSegment unPathSegment _FunctionName$fDataPathSegment$fShowPathSegment$fEqPathSegment$fIsStringPathSegment$fSemigroupPathSegment$fMonoidPathSegmentArg_argName_argType _PathSegment $fDataArg$fEqArg $fShowArg SegmentTypeStaticCapargNameargTypeargPath$fDataSegmentType$fEqSegmentType$fShowSegmentTypeSegment unSegment_Static_Cap $fDataSegment $fEqSegment $fShowSegmentFrag unFragmentPath_Segment isCapture captureArg $fDataFrag$fEqFrag $fShowFragArgTypeNormalFlagList_Frag $fDataArgType $fEqArgType $fShowArgTypeQueryArg _queryArgName _queryArgType_Normal_Flag_List$fDataQueryArg $fEqQueryArg$fShowQueryArg HeaderArgReplaceHeaderArg _headerArg_headerPattern queryArgName queryArgType$fDataHeaderArg $fEqHeaderArg$fShowHeaderArg headerArg headerPatternUrl_path _queryStr_frag _HeaderArg_ReplaceHeaderArgdefUrl $fDataUrl$fEqUrl $fShowUrlReq_reqUrl _reqMethod _reqHeaders_reqBody_reqReturnType _reqFuncName_reqBodyContentTypeReqBodyContentType ReqBodyJSONReqBodyMultipartfragpathqueryStr $fDataReq$fEqReq $fShowReq$fDataReqBodyContentType$fEqReqBodyContentType$fShowReqBodyContentType$fReadReqBodyContentType GenerateList generateListEmptyForeignAPI HasForeignForeign foreignForNoTypesHasForeignTypetypeForreqBodyreqBodyContentType reqFuncName reqHeaders reqMethod reqReturnTypereqUrldefReq listFromAPI*$fHasForeignTypeTYPEkNoTypesNoContentftype$fHasForeignklangftype:>$fHasForeignklangftype:>0$fHasForeignklangftype:>1&$fHasForeignklangftypeWithNamedContext$fHasForeignklangftype:>2$fHasForeignklangftype:>3$fHasForeignklangftype:>4$fHasForeignklangftype:>5$fHasForeignklangftype:>6$fHasForeignklangftype:>7$fHasForeignklangftypeRaw$fHasForeignklangftype:>8$fHasForeignklangftype:>9$fHasForeignklangftype:>10$fHasForeignklangftype:>11$fHasForeignklangftype:>12$fHasForeignklangftypeStream#$fHasForeignklangftypeNoContentVerb$fHasForeignklangftypeVerb$fHasForeignklangftype:>13$fHasForeignklangftype:>14$fHasForeignklangftype:<|>$fHasForeignklangftypeEmptyAPI$fGenerateListftype:<|>$fGenerateListftypeReq"$fGenerateListftypeEmptyForeignAPI concatCaseL concatCase snakeCaseL snakeCase camelCaseL camelCasebaseData.Type.BoolIf)http-api-data-0.4.2-9YuFbFCyrYfcy8qiOXzOoWeb.Internal.HttpApiData ToHttpApiData toQueryParamtoHeader toUrlPiecetoEncodedUrlPieceFromHttpApiDataparseQueryParam parseUrlPiece parseHeader(http-types-0.12.3-LMMV4F9OuE2BJ0myUSAImxNetwork.HTTP.Types.Version HttpVersion httpMajor httpMinorNetwork.HTTP.Types.Method StdMethodPATCHOPTIONSCONNECTTRACEDELETEPUTHEADGETPOST*network-uri-2.6.3.0-8tJyeRBDup92wNsuQRxrki Network.URIURI uriFragmenturiQueryuriPath uriScheme uriAuthority%servant-0.18.2-80drE78NifXC7j6gzxhw1K Servant.LinkssafeLinkLinkMkLinkHasLinktoLinkServant.API.StreamStream StreamGet StreamPost StreamBody StreamBody'SourceIO ToSourceIO toSourceIO FromSourceIO fromSourceIO FramingRender framingRenderFramingUnrenderframingUnrender NoFramingNewlineFramingNetstringFramingServant.API.WithNamedContextWithNamedContextServant.API.TypeLevelIsElem'IsElemServant.API.VerbsVerb NoContentVerbGetPostPutDeletePatch PostCreated PutCreated GetAccepted PostAcceptedDeleteAccepted PatchAccepted PutAcceptedGetNonAuthoritativePostNonAuthoritativeDeleteNonAuthoritativePatchNonAuthoritativePutNonAuthoritative GetNoContent PostNoContentDeleteNoContentPatchNoContent PutNoContentGetResetContentPostResetContentGetPartialContent ReflectMethod reflectMethodServant.API.UVerbstatusOfStatusOf HasStatusStatuses WithStatusUVerbServant.API.UVerb.UnionUnionIsMemberUniqueServant.API.Sub:>Servant.API.ResponseHeaderslookupResponseHeadernoHeader addHeaderHeaders getResponsegetHeadersHListResponseHeaderUndecodableHeaderHeader MissingHeaderHListHNilHConsBuildHeadersTobuildHeadersTo GetHeaders getHeaders AddHeaderHasResponseHeaderServant.API.ReqBodyReqBodyReqBody'Servant.API.RemoteHost RemoteHostServant.API.RawRawServant.API.QueryParam QueryParam QueryParam' QueryParams QueryFlagServant.API.HeaderHeader'Servant.API.ModifiersRequiredOptionalLenientStrictServant.API.IsSecureIsSecureSecure NotSecureServant.API.FragmentFragmentServant.API.Experimental.Auth AuthProtectServant.API.EmptyEmptyAPIServant.API.DescriptionSummary DescriptionServant.API.ContentTypesJSON PlainTextFormUrlEncoded OctetStreamAccept contentType contentTypes MimeRender mimeRender MimeUnrender mimeUnrendermimeUnrenderWithType NoContentServant.API.CaptureCaptureCapture' CaptureAllServant.API.BasicAuth BasicAuth BasicAuthDatabasicAuthUsernamebasicAuthPasswordServant.API.Alternative:<|>$vault-0.3.1.4-8uu8SgwCPZe4ugwkLbUKdMData.Vault.LazyVault+singleton-bool-0.1.5-HROmJ2x3IGbHtluHkmYgNWData.Singletons.BoolSBoolIsboolSBoolSFalseSTrueinject