Array of decoders to try in sequence
How to display the name of the object being decoded in errors
A decoder that tries each decoder in sequence until all succeed
type User = { firstname: string; lastname: string; role: 'admin' | 'user'; };
const firstnameDecoder = JsonDecoder.object({ firstname: JsonDecoder.string() }, '{firstname: string}');
const lastnameDecoder = JsonDecoder.object({ lastname: JsonDecoder.string() }, '{lastname: string}');
const roleDecoder = JsonDecoder.oneOf([JsonDecoder.literal('admin'), JsonDecoder.literal('user')], 'admin | user');
const userDecoder: Decoder<User> = JsonDecoder.allOf(
[firstnameDecoder, lastnameDecoder, JsonDecoder.object({ role: roleDecoder }, 'role')],
'User'
);
userDecoder.decode({ firstname: 'John', lastname: 'Doe', role: 'admin' }); // Ok<User>({value: { firstname: 'John', lastname: 'Doe', role: 'admin' }})
userDecoder.decode({ firstname: 'John' }); // Err({error: '<User> allOf decoder failed at index #1 with <{lastname: string}> decoder failed at key "lastname" with error: undefined is not a valid string'})
A decoder that succeeds only if all provided decoders succeed.