diff --git a/protobuf_serialization/types.nim b/protobuf_serialization/types.nim index a406efa..95ba285 100644 --- a/protobuf_serialization/types.nim +++ b/protobuf_serialization/types.nim @@ -83,6 +83,12 @@ template mget*(opt: var PBOption): untyped = opt.some = true opt.value +template valueOr*(opt: PBOption, def: untyped): untyped = + if opt.some: + opt.value + else: + def + func pbSome*[T: PBOption](optType: typedesc[T], value: auto): T {.inline.} = T( some: true, diff --git a/tests/test_protobuf2_semantics.nim b/tests/test_protobuf2_semantics.nim index 75e9c31..1429990 100644 --- a/tests/test_protobuf2_semantics.nim +++ b/tests/test_protobuf2_semantics.nim @@ -136,3 +136,32 @@ suite "Test Encoding of Protobuf 2 Semantics": pbNone("").isNone PBOption[""]() == pbNone("") PBOption[default(Required)]() == pbNone(default(Required)) + + test "PBOptional valueOr": + check: + pbNone(1'u32).valueOr(if true: 123 else: 456) == 123'u32 + pbNone(1'i32).valueOr(123) == 123'i32 + pbNone(1'u32).valueOr(123) == 123'u32 + pbNone(1'i32).valueOr(123) == 123'i32 + pbSome(1'i64).valueOr(123'i64) == 1'i64 + pbNone(0'i64).valueOr(123'i64) == 123'i64 + pbSome(1'i32).valueOr(123'i32) == 1'i32 + pbNone(0'i32).valueOr(123'i32) == 123'i32 + pbSome(1'u64).valueOr(123'u64) == 1'u64 + pbNone(0'u64).valueOr(123'u64) == 123'u64 + pbSome(1'u32).valueOr(123'u32) == 1'u32 + pbNone(0'u32).valueOr(123'u32) == 123'u32 + pbSome(1'f64).valueOr(123'f64) == 1'f64 + pbNone(0'f64).valueOr(123'f64) == 123'f64 + pbSome(1'f32).valueOr(123'f32) == 1'f32 + pbNone(0'f32).valueOr(123'f32) == 123'f32 + pbSome(true).valueOr(false) == true + pbSome(false).valueOr(true) == false + pbNone(false).valueOr(true) == true + pbNone(true).valueOr(false) == false + pbSome("abc").valueOr("def") == "abc" + pbNone("").valueOr("def") == "def" + pbSome(@[1'u8]).valueOr(@[123'u8]) == @[1'u8] + pbNone(default(seq[byte])).valueOr(@[123'u8]) == @[123'u8] + pbSome(Required(b: 1)).valueOr(Required(b: 123)) == Required(b: 1) + pbNone(default(Required)).valueOr(Required(b: 123)) == Required(b: 123)