GetShopTV/swagger2

reuse toJSON instances

Open

#127 opened on Oct 10, 2017

View on GitHub
 (6 comments) (0 reactions) (0 assignees)Haskell (61 forks)github user discovery
documentationhelp wantedquestion

Repository metrics

Stars
 (74 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

E.g. I have type

data PaymentOptionsCommon id =
  PaymentOptions
    { poId          :: id
    , poPaymentType :: Maybe PaymentMethod
    , poPaymentNet  :: Maybe Int
    , poInstallment :: Maybe Int  -- days
    } deriving (Generic, Eq, Ord, Show)

type PaymentOptions   = PaymentOptionsCommon ()

And ToJSON instance like this:

instance FromJSON PaymentOptions where
  parseJSON = withObject "paymentOptions" $ \o -> do
    poId          <- skip
    poPaymentType <- o .:? "type"
    poPaymentNet  <- o .:? "deffered"
    poInstallment <- o .:? "installment"
    return $! PaymentOptions{..}

instance ToJSON PaymentOptions where
  toJSON PaymentOptions{..} =
    object
      [ "type"        .= poPaymentType
      , "deffered"    .= poPaymentNet
      , "installment" .= poInstallment
      ]

And auto-generated ToSchema instance:

instance ToSchema PaymentOptions

So, swagger would looks like:

  PaymentOptionsCommon:
    required:
      - poId
    properties:
      poId:
        items: []
        type: array
      poPaymentType:
        $ref: '#/definitions/PaymentMethod'
      poPaymentNet:
        maximum: 9223372036854776000
        minimum: -9223372036854776000
        type: integer
      poInstallment:
        maximum: 9223372036854776000
        minimum: -9223372036854776000
        type: integer
    type: object

But instead I expect to see something more like:

  PaymentOptions:
    properties:
      type:
        $ref: '#/definitions/PaymentMethod'
      deffered:
        maximum: 9223372036854776000
        minimum: -9223372036854776000
        type: integer
      installment:
        maximum: 9223372036854776000
        minimum: -9223372036854776000
        type: integer
    type: object

Without prefixes

The question is: how to do this?

Contributor guide