This package provides a simple JSON (de)serialization support for @rustresult/result
.
> npm install @rustresult/json
> pnpm install @rustresult/json
> yarn add @rustresult/json
You can always write your (de)serialization implementation for your use cases. But before you write it, you can check following functions to see if they can help you.
import { ResultJSON } from '@rustresult/json';
// serialization
ResultJSON.serialize(Ok(1)) // { type: 'ok', value: 1 }
ResultJSON.serialize(Err('Some error message')) // { type: 'err', value: 'Some error message' }
ResultJSON.serialize(Ok(Ok(2))) // { type: 'ok', value: { type: 'ok', value: 2 } }
// deserialization
ResultJSON.deserialize({ type: 'ok', value: 1 }) // Ok(1)
ResultJSON.deserialize({ type: 'err', value: 'Some error message' }) // Err('Some error message')
ResultJSON.deserialize({ type: 'ok', value: { type: 'ok', value: 2 } }) // Ok({ type: 'ok', value: 2 }) *the nested `Result` won't be deserialized*
This simple implementation only covers a few use cases. It may not be suitable if:
- the
Result
has a nestedResult
- the
Result
is in a complex structure - the
Result
contains a complex object, such as a class instance, requiring custom (de)serialization
The format of the JSON object follows the adjacently tagged enum representation in Rust library Serde.
The reason it doesn't follow the externally tagged enum representation (the default in Serde) is that, the externally tagged representation of Ok(undefined)
and Err(undefined)
are both {}
, therefore we can't tell whether {}
should be deserialized to Ok(undefined)
or Err(undefined)
.
There're some great JSON (de)serialization libraries for complex objects:
- Check out
@rustresult/json-serializr
for the better JSON (de)serialization support using theserializr
library