servant-csharp 0.0.6.1 → 0.0.7.0
raw patch · 3 files changed
+160/−6 lines, 3 filesdep +uuiddep +uuid-typesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: uuid, uuid-types
API changes (from Hackage documentation)
- CS: [convtemplate] :: GenerateCsConfig -> GenerateCsConfig -> IO String
- CS.JsonDotNet: [convtemplate] :: GenerateCsConfig -> GenerateCsConfig -> IO String
+ CS: [apiCsName] :: GenerateCsConfig -> String
+ CS: [assemblyinfotemplate] :: GenerateCsConfig -> GenerateCsConfig -> IO String
+ CS: [classCsName] :: GenerateCsConfig -> String
+ CS: [converterCsName] :: GenerateCsConfig -> String
+ CS: [convertertemplate] :: GenerateCsConfig -> GenerateCsConfig -> IO String
+ CS: [csprojtemplate] :: GenerateCsConfig -> GenerateCsConfig -> IO String
+ CS: [enumCsName] :: GenerateCsConfig -> String
+ CS: [guid] :: GenerateCsConfig -> Maybe String
+ CS: [outdir] :: GenerateCsConfig -> String
+ CS: assemblyInfoCsForAPI :: IO String
+ CS: assemblyInfoCsForAPIWith :: GenerateCsConfig -> IO String
+ CS: csprojForAPI :: IO String
+ CS: csprojForAPIWith :: GenerateCsConfig -> IO String
+ CS: genCsForAPI :: (HasForeign CSharp Text api, GenerateList Text (Foreign Text api)) => GenerateCsConfig -> Proxy api -> IO ()
+ CS.JsonDotNet: [apiCsName] :: GenerateCsConfig -> String
+ CS.JsonDotNet: [assemblyinfotemplate] :: GenerateCsConfig -> GenerateCsConfig -> IO String
+ CS.JsonDotNet: [classCsName] :: GenerateCsConfig -> String
+ CS.JsonDotNet: [converterCsName] :: GenerateCsConfig -> String
+ CS.JsonDotNet: [convertertemplate] :: GenerateCsConfig -> GenerateCsConfig -> IO String
+ CS.JsonDotNet: [csprojtemplate] :: GenerateCsConfig -> GenerateCsConfig -> IO String
+ CS.JsonDotNet: [enumCsName] :: GenerateCsConfig -> String
+ CS.JsonDotNet: [guid] :: GenerateCsConfig -> Maybe String
+ CS.JsonDotNet: [outdir] :: GenerateCsConfig -> String
+ CS.JsonDotNet: assemblyInfoCsForAPI :: IO String
+ CS.JsonDotNet: assemblyInfoCsForAPIWith :: GenerateCsConfig -> IO String
+ CS.JsonDotNet: csprojForAPI :: IO String
+ CS.JsonDotNet: csprojForAPIWith :: GenerateCsConfig -> IO String
+ CS.JsonDotNet: genCsForAPI :: (HasForeign CSharp Text api, GenerateList Text (Foreign Text api)) => GenerateCsConfig -> Proxy api -> IO ()
- CS: GenerateCsConfig :: String -> (GenerateCsConfig -> IO String) -> (forall api. (HasForeign CSharp Text api, GenerateList Text (Foreign Text api)) => GenerateCsConfig -> Proxy api -> IO String) -> (GenerateCsConfig -> IO String) -> (GenerateCsConfig -> IO String) -> [FilePath] -> GenerateCsConfig
+ CS: GenerateCsConfig :: String -> String -> String -> String -> String -> String -> (GenerateCsConfig -> IO String) -> (forall api. (HasForeign CSharp Text api, GenerateList Text (Foreign Text api)) => GenerateCsConfig -> Proxy api -> IO String) -> (GenerateCsConfig -> IO String) -> (GenerateCsConfig -> IO String) -> (GenerateCsConfig -> IO String) -> (GenerateCsConfig -> IO String) -> Maybe String -> [FilePath] -> GenerateCsConfig
- CS.JsonDotNet: GenerateCsConfig :: String -> (GenerateCsConfig -> IO String) -> (forall api. (HasForeign CSharp Text api, GenerateList Text (Foreign Text api)) => GenerateCsConfig -> Proxy api -> IO String) -> (GenerateCsConfig -> IO String) -> (GenerateCsConfig -> IO String) -> [FilePath] -> GenerateCsConfig
+ CS.JsonDotNet: GenerateCsConfig :: String -> String -> String -> String -> String -> String -> (GenerateCsConfig -> IO String) -> (forall api. (HasForeign CSharp Text api, GenerateList Text (Foreign Text api)) => GenerateCsConfig -> Proxy api -> IO String) -> (GenerateCsConfig -> IO String) -> (GenerateCsConfig -> IO String) -> (GenerateCsConfig -> IO String) -> (GenerateCsConfig -> IO String) -> Maybe String -> [FilePath] -> GenerateCsConfig
Files
- servant-csharp.cabal +3/−1
- src/CS.hs +7/−1
- src/CS/JsonDotNet.hs +150/−4
servant-csharp.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: servant-csharp-version: 0.0.6.1+version: 0.0.7.0 synopsis: Generate servant client library for C# description: Generate servant client library for C# homepage: https://github.com/cutsea110/servant-csharp.git@@ -39,5 +39,7 @@ , servant-foreign >=0.7 && <0.8 , text >=1.2 && <1.3 , time >=1.5 && <1.6+ , uuid >=1.3 && <1.4+ , uuid-types >=1.0 && <1.1 hs-source-dirs: src default-language: Haskell2010
src/CS.hs view
@@ -1,4 +1,6 @@-module CS ( classCsForAPI+module CS ( genCsForAPI++ , classCsForAPI , classCsForAPIWith , apiCsForAPI , apiCsForAPIWith@@ -6,6 +8,10 @@ , enumCsForAPIWith , converterCsForAPI , converterCsForAPIWith+ , assemblyInfoCsForAPI+ , assemblyInfoCsForAPIWith+ , csprojForAPI+ , csprojForAPIWith , GenerateCsConfig(..) , def
src/CS/JsonDotNet.hs view
@@ -4,7 +4,9 @@ {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-}-module CS.JsonDotNet ( classCsForAPI+module CS.JsonDotNet ( genCsForAPI++ , classCsForAPI , classCsForAPIWith , apiCsForAPI , apiCsForAPIWith@@ -12,6 +14,10 @@ , enumCsForAPIWith , converterCsForAPI , converterCsForAPIWith+ , assemblyInfoCsForAPI+ , assemblyInfoCsForAPIWith+ , csprojForAPI+ , csprojForAPIWith , GenerateCsConfig(..) , def@@ -28,14 +34,24 @@ import Data.Monoid ((<>)) import Data.Proxy import Data.Text as T (Text, unpack, pack)+import Data.Time.Clock (UTCTime(..), getCurrentTime)+import Data.Time.Calendar (toGregorian)+import Data.UUID.Types (toString)+import Data.UUID.V4 as UUID (nextRandom) import Language.Haskell.Exts import Servant.Foreign+import System.Directory (createDirectoryIfMissing) import Text.Heredoc import CS.Common (CSharp, getEndpoints) data GenerateCsConfig = GenerateCsConfig { namespace :: String+ , outdir :: String+ , classCsName :: String+ , apiCsName :: String+ , enumCsName :: String+ , converterCsName :: String , classtemplate :: GenerateCsConfig -> IO String , apitemplate :: forall api. (HasForeign CSharp Text api,@@ -44,19 +60,44 @@ -> Proxy api -> IO String , enumtemplate :: GenerateCsConfig -> IO String- , convtemplate :: GenerateCsConfig -> IO String+ , convertertemplate :: GenerateCsConfig -> IO String+ , assemblyinfotemplate :: GenerateCsConfig -> IO String+ , csprojtemplate :: GenerateCsConfig -> IO String+ , guid :: Maybe String , sources :: [FilePath] } def :: GenerateCsConfig def = GenerateCsConfig { namespace = "ServantClientAPI"+ , outdir = "gen"+ , classCsName = "Classes.cs"+ , apiCsName = "API.cs"+ , enumCsName = "Enum.cs"+ , converterCsName = "JsonConverter.cs" , classtemplate = defClassTemplate , apitemplate = defAPITemplate , enumtemplate = defEnumTemplate- , convtemplate = defConvTemplate+ , convertertemplate = defConvTemplate+ , assemblyinfotemplate = defAssemblyInfoTemplate+ , csprojtemplate = defCsprojTemplate+ , guid = Nothing , sources = [] } +genCsForAPI :: (HasForeign CSharp Text api,+ GenerateList Text (Foreign Text api)) =>+ GenerateCsConfig -> Proxy api -> IO ()+genCsForAPI conf api = do+ guid' <- maybe (toString <$> UUID.nextRandom) return $ guid conf+ let conf' = conf { guid = Just guid' }+ createDirectoryIfMissing True [heredoc|${outdir conf'}/${namespace conf'}/Properties|]+ classCsForAPIWith conf' >>= writeFile [heredoc|${outdir conf'}/${namespace conf'}${classCsName conf'}|]+ apiCsForAPIWith conf' api >>= writeFile [heredoc|${outdir conf'}/${namespace conf'}${apiCsName conf'}|]+ enumCsForAPIWith conf' >>= writeFile [heredoc|${outdir conf'}/${namespace conf'}${enumCsName conf'}|]+ converterCsForAPIWith conf' >>= writeFile [heredoc|${outdir conf'}/${namespace conf'}${converterCsName conf'}|]+ assemblyInfoCsForAPIWith conf' >>= writeFile [heredoc|${outdir conf'}/${namespace conf'}/Properties/AssemblyInfo.cs|]+ csprojForAPIWith conf' >>= writeFile [heredoc|${outdir conf'}/${namespace conf'}/${namespace conf'}.cs|]+ -------------------------------------------------------------------------- isDatatypeDecl :: Decl -> Bool isDatatypeDecl (DataDecl _ DataType _ _ _ [qcon] _) = True@@ -313,7 +354,7 @@ converterCsForAPI = converterCsForAPIWith def converterCsForAPIWith :: GenerateCsConfig -> IO String-converterCsForAPIWith conf = (convtemplate conf) conf+converterCsForAPIWith conf = (convertertemplate conf) conf defClassTemplate :: GenerateCsConfig -> IO String defClassTemplate conf = do@@ -500,3 +541,108 @@ } } |]++--------------------------------------------------------------------------++assemblyInfoCsForAPI :: IO String+assemblyInfoCsForAPI = assemblyInfoCsForAPIWith def++assemblyInfoCsForAPIWith :: GenerateCsConfig -> IO String+assemblyInfoCsForAPIWith conf = (assemblyinfotemplate conf) conf++defAssemblyInfoTemplate :: GenerateCsConfig -> IO String+defAssemblyInfoTemplate conf = do+ (year, _, _) <- fmap (toGregorian . utctDay) getCurrentTime+ guid <- maybe (toString <$> UUID.nextRandom) return $ guid conf+ return [heredoc|+using System.Reflection;+using System.Runtime.CompilerServices;+using System.Runtime.InteropServices;++[assembly: AssemblyTitle("${namespace conf}")]+[assembly: AssemblyDescription("")]+[assembly: AssemblyConfiguration("")]+[assembly: AssemblyCompany("")]+[assembly: AssemblyProduct("${namespace conf}")]+[assembly: AssemblyCopyright("Copyright © ${show year}")]+[assembly: AssemblyTrademark("")]+[assembly: AssemblyCulture("")]++[assembly: ComVisible(false)]++[assembly: Guid("${guid}")]++// [assembly: AssemblyVersion("1.0.*")]+[assembly: AssemblyVersion("1.0.0.0")]+[assembly: AssemblyFileVersion("1.0.0.0")]+|]++--------------------------------------------------------------------------++csprojForAPI :: IO String+csprojForAPI = csprojForAPIWith def++csprojForAPIWith :: GenerateCsConfig -> IO String+csprojForAPIWith conf = (csprojtemplate conf) conf++defCsprojTemplate :: GenerateCsConfig -> IO String+defCsprojTemplate conf = do+ guid <- maybe ((map toUpper . toString) <$> UUID.nextRandom) return $ guid conf+ return [heredoc|<?xml version="1.0" encoding="utf-8"?>+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />+ <PropertyGroup>+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>+ <ProjectGuid>{${guid}}</ProjectGuid>+ <OutputType>Library</OutputType>+ <AppDesignerFolder>Properties</AppDesignerFolder>+ <RootNamespace>${namespace conf}</RootNamespace>+ <AssemblyName>${namespace conf}</AssemblyName>+ <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>+ <FileAlignment>512</FileAlignment>+ </PropertyGroup>+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">+ <DebugSymbols>true</DebugSymbols>+ <DebugType>full</DebugType>+ <Optimize>false</Optimize>+ <OutputPath>bin\Debug\</OutputPath>+ <DefineConstants>DEBUG;TRACE</DefineConstants>+ <ErrorReport>prompt</ErrorReport>+ <WarningLevel>4</WarningLevel>+ </PropertyGroup>+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">+ <DebugType>pdbonly</DebugType>+ <Optimize>true</Optimize>+ <OutputPath>bin\Release\</OutputPath>+ <DefineConstants>TRACE</DefineConstants>+ <ErrorReport>prompt</ErrorReport>+ <WarningLevel>4</WarningLevel>+ </PropertyGroup>+ <ItemGroup>+ <Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL" />+ <Reference Include="System" />+ <Reference Include="System.Core" />+ <Reference Include="System.Xml.Linq" />+ <Reference Include="System.Data.DataSetExtensions" />+ <Reference Include="Microsoft.CSharp" />+ <Reference Include="System.Data" />+ <Reference Include="System.Net.Http" />+ <Reference Include="System.Xml" />+ </ItemGroup>+ <ItemGroup>+ <Compile Include="${apiCsName conf}" />+ <Compile Include="${converterCsName conf}" />+ <Compile Include="${classCsName conf}" />+ <Compile Include="${enumCsName conf}" />+ <Compile Include="Properties\AssemblyInfo.cs" />+ </ItemGroup>+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets.+ <Target Name="BeforeBuild">+ </Target>+ <Target Name="AfterBuild">+ </Target>+ -->+</Project>|]