Пользовательский экземпляр ToJSON для постоянного ключа


Я создаю веб-приложение в Haskell. Я использую постоянную библиотеку для подключения к базе данных postgresql.

Я использую стандартную файловую систему определения схемы, в которой шаблон Haskell используется для создания типов из схемы.

share [mkPersist sqlSettings, mkMigrate "migrateAll"]
  $(persistFileWith lowerCaseSettings "schema")

У меня есть много типов данных, определенных в моем файле схемы, которые выглядят так (поддельный пример):

User json
  email Text

Post json
  owner UserId
  name  Text
  body  Text

"json" рядом с "Post" указывает, что ToJSON / FromJSON должны быть автоматически сгенерированы платформой.

I я использую эту автоматическую генерацию экземпляров для многих из моих типов, чтобы я мог сериализовать их по сети.

Моя проблема: я хочу предоставить пользовательский экземпляр ToJSON для ключей. Например, в приведенном выше " UserId "будет"ключевым пользователем". Каждый раз для него автоматически генерируется такой экземпляр "PostId", как "Key Post" и т. д.

Когда" Post "сериализуется, он преобразует" owner "из ключа в номер индекса, например,"52".

Я хотел бы ... сериализуйте все ключи базы данных в другой стиль. Например, вместо того, чтобы производить число '52', производя строку "fiftytwo" (просто пример).

Если бы я не использовал генерацию кода, я мог бы сделать что-то вроде

instance ToJSON (Key record) where
  toJSON _ = Data.Aeson.String "placeholder"

Но для этого потребуется не использовать автоматическую генерацию кода из-за перекрывающихся ошибок экземпляра. Возможно, есть способ сказать генератору кода, чтобы он не создавал экземпляры "ToJSON (Key Post)" и т. д. Для всех типов данных?

Я мог бы также просто напишите пользовательские объявления экземпляров для каждого типа, но это будет очень избыточно.

Я знаком с использованием newtypes, чтобы иметь несколько экземпляров класса типа, однако это не очень хорошо вписывается в этот сценарий.

Спасибо!

1 4

1 ответ:

Основываясь на рекомендации в комментарии haoformayor, этот вопрос теперь решен. Ответ заключается в том, чтобы развилить библиотеку постоянных шаблонов и изменить часть mkKeyTypeDec.