2017-04-17 17 views
0

的自動推導產生的場我有以下類型:定製由ToSchema

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-swagger生成Swagger文檔,這需要DeviceToSchema實例。現在問題是生成的模式將具有上述訪問器函數的給定前綴名稱(_deviceId_deviceName_deviceDType)。相反,我會有修改後的版本(id,namedtype)。

有沒有辦法以這種方式定製泛型派生過程?

回答

3

不太熟悉servant-swaggerswagger2,但它看起來像這樣的事情應該做的工作:

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

instance ToSchema Device where 
    declareNamedSchema = 
    genericDeclareNamedSchema 
     defaultSchemaOptions {fieldLabelModifier = \fieldLabel -> ...}