openapi-generator/samples/server/petstore/haskell-servant
2017-03-18 15:39:10 +08:00
..
lib/SwaggerPetstore Merge remote-tracking branch 'origin' into 2.3.0 2017-03-18 15:39:10 +08:00
.swagger-codegen-ignore fix casting issue with ModelImpl in Haskell 2016-07-27 18:07:35 +08:00
README.md refactor special mapping to defualt codegen 2016-05-11 15:44:06 +08:00
Setup.hs Rename 2016-02-01 08:56:15 +09:00
stack.yaml [Haskell] Fix broken client/server compilation errors (#5097) 2017-03-17 16:55:11 +08:00
swagger-petstore.cabal refactor special mapping to defualt codegen 2016-05-11 15:44:06 +08:00

Auto-Generated Swagger Bindings to SwaggerPetstore

The library in lib provides auto-generated-from-Swagger bindings to the SwaggerPetstore API.

Installation

Installation follows the standard approach to installing Stack-based projects.

  1. Install the Haskell stack tool.
  2. Run stack install to install this package.

Main Interface

The main interface to this library is in the SwaggerPetstore.API module, which exports the SwaggerPetstoreBackend type. The SwaggerPetstoreBackend type can be used to create and define servers and clients for the API.

Creating a Client

A client can be created via the createSwaggerPetstoreClient function, which, if provided with a hostname and a port, will generate a client that can be used to access the API if it is being served at that hostname / port combination. For example, if localhost:8080 is serving the SwaggerPetstore API, you can write:

{-# LANGUAGE RecordWildCards #-}

import SwaggerPetstore.API

main :: IO ()
main = do
  SwaggerPetstoreBackend{..} <- createSwaggerPetstoreClient (ServerConfig "localhost" 8080)
  -- Any SwaggerPetstore API call can go here.
  return ()

Creating a Server

In order to create a server, you must use the runSwaggerPetstoreServer function. However, you unlike the client, in which case you got a SwaggerPetstoreBackend from the library, you must instead provide a SwaggerPetstoreBackend. For example, if you have defined handler functions for all the functions in SwaggerPetstore.Handlers, you can write:

{-# LANGUAGE RecordWildCards #-}

import SwaggerPetstore.API

-- A module you wrote yourself, containing all handlers needed for the SwaggerPetstoreBackend type.
import SwaggerPetstore.Handlers

-- Run a SwaggerPetstore server on localhost:8080
main :: IO ()
main = do
  let server = SwaggerPetstoreBackend{..}
  runSwaggerPetstoreServer (ServerConfig "localhost" 8080) server

You could use optparse-applicative or a similar library to read the host and port from command-line arguments:

{-# LANGUAGE RecordWildCards #-}

module Main (main) where

import SwaggerPetstore.API (runSwaggerPetstoreServer, SwaggerPetstoreBackend(..), ServerConfig(..))

import Control.Applicative ((<$>), (<*>))
import Options.Applicative (execParser, option, str, auto, long, metavar, help)

main :: IO ()
main = do
  config <- parseArguments
  runSwaggerPetstoreServer config SwaggerPetstoreBackend{}

-- | Parse host and port from the command line arguments.
parseArguments :: IO ServerConfig
parseArguments =
  execParser $
    ServerConfig
      <$> option str  (long "host" <> metavar "HOST" <> help "Host to serve on")
      <*> option auto (long "port" <> metavar "PORT" <> help "Port to serve on")