Отказ от ответственности: я никогда не использовал Swagger.
Однако, глядя на документацию по нему, я вижу следующий элемент в типе Swagger:
_swaggerPaths :: InsOrdHashMap FilePath PathItem
- соответствует объективу paths
.
Глядя на определение PathItem
, вы обнаруживаете, что это не экземпляр HasOperationId
- он сам состоит из
PathItem
_pathItemGet :: Maybe Operation
_pathItemPut :: Maybe Operation
_pathItemPost :: Maybe Operation
_pathItemDelete :: Maybe Operation
_pathItemOptions :: Maybe Operation
_pathItemHead :: Maybe Operation
_pathItemPatch :: Maybe Operation
_pathItemParameters :: [Referenced Param]
, который, кажется, наводит на мысль о том, что вам не хватает композиции Lens в
(\k v -> v & (??? . operationId) ?~ (pack "hello"))
; что-то похожее на
(\k v -> v & (itemGet . operationId) ?~ (pack "hello"))
РЕДАКТИРОВАТЬ:
Похоже, что то, что вы пытаетесь достичь (настройка простой операции пути), может быть легко сделано с помощью экземпляра Monoid
записи PathItem
, например:
genOpsId = paths %~ InsOrdHashMap.mapWithKey (\k v -> v & get ?~ (mempty & operationId ?~ (pack "hello")))
EDIT # 2:
В соответствии с запросом, есть один способ перебрать поля записи PathItem
и установить идентификатор операции из тех, которые присутствуют.
Для справки, я почти уверен, что есть способ, способ, более чистый способ сделать это, но здесь идет.
dokey :: PathItem -> PathItem
dokey v = foldl
(\acc nv -> acc & nv %~ (fmap $ operationId ?~ (pack "hello")))
v
[get, put, post, delete, options, head_, patch]
genOpIds :: Swagger -> Swagger
genOpIds = paths %~ InsOrdHashMap.mapWithKey (\k -> doKey)
Надеюсь, это поможет! :)