0

我有以下类型:

data Device = Device { _deviceId    :: DeviceId
                     , _deviceName  :: Text
                     , _deviceDtype :: DType }
            deriving (Show, Eq, Generic)
makeFields ''Device
$(deriveJSON (mkOptions "_device") ''Device)

这里我使用deriveJSON代替Generic机制,因为我需要为此数据类型调整 JSON 表示的字段名称:

-- | Make JSON conversion options.
mkOptions :: String -> Options
mkOptions prefix = defaultOptions { fieldLabelModifier = removePrefix prefix
                                  , unwrapUnaryRecords = True
                                  }

需要前缀来为该类型生成镜头,但在 JSON 表示中不需要。

现在我正在尝试使用servant-swaggerToSchema生成Swagger文档,这需要一个Device. 现在的问题是生成的模式将具有上述访问器函数的给定前缀名称(_deviceId、、、_deviceName_deviceDType。相反,我会拥有修改后的版本(idnamedtype)。

有没有办法以这种方式自定义通用派生过程?

4

1 回答 1

4

不太熟悉,servant-swaggerswagger2看起来像这样的东西应该可以完成这项工作:

import Data.Swagger.Schema
import Data.Swagger.SchemaOptions

instance ToSchema Device where
  declareNamedSchema =
    genericDeclareNamedSchema
      defaultSchemaOptions {fieldLabelModifier = \fieldLabel -> ...}
于 2017-04-17T15:02:02.673 回答