Add custom database mapping hooks

This commit is contained in:
jdb
2026-09-02 12:21:23 -05:00
parent 170359d840
commit 06b568e071
6 changed files with 197 additions and 43 deletions
+20
View File
@@ -0,0 +1,20 @@
import std/[strutils]
type
ValidatedId* = distinct string
Money* = object
cents*: int64
proc fromDbHook*(
_: typedesc[ValidatedId],
value: string): ValidatedId =
if not value.startsWith("id_"):
raise newException(ValueError, "validated ID must begin with id_")
ValidatedId(value.toUpperAscii)
proc fromDbHook*(_: typedesc[Money], value: string): Money =
Money(cents: value.parseBiggestInt)
+45
View File
@@ -0,0 +1,45 @@
import std/[options, unittest]
import fiber_orm/util
import ./custom_db_types
type CustomModel = object
id: ValidatedId
optionalId: Option[ValidatedId]
absentId: Option[ValidatedId]
relatedIds: seq[ValidatedId]
balance: Money
suite "custom database mappings":
test "uses custom mappings for values nested in structural types":
let model = rowToModel(CustomModel, @[
"id_primary",
"id_optional",
"",
"{id_first,id_second}",
"1250",
])
check:
string(model.id) == "ID_PRIMARY"
model.optionalId.isSome
string(model.optionalId.get) == "ID_OPTIONAL"
model.absentId.isNone
model.relatedIds.len == 2
string(model.relatedIds[0]) == "ID_FIRST"
string(model.relatedIds[1]) == "ID_SECOND"
model.balance.cents == 1_250
test "propagates errors from custom mappings without falling back":
expect ValueError:
discard rowToModel(CustomModel, @[
"invalid",
"",
"",
"{}",
"1250",
])