mirror of https://github.com/boa-dev/boa.git
Browse Source
* Implement TryFromJs for Either<L, R> * Add explicit feature in Cargo.tomlpull/3832/head
Hans Larsen
7 months ago
committed by
GitHub
4 changed files with 48 additions and 0 deletions
@ -0,0 +1,44 @@
|
||||
//! Implementation of [`TryFromJs`] for [`Either`].
|
||||
//!
|
||||
//! This will try to deserialize for the [`Either::Left`] type
|
||||
//! first, and if it fails will try the [`Either::Right`] type.
|
||||
//!
|
||||
//! Upon failure of both, the second failure will be returned.
|
||||
#![cfg(feature = "either")] |
||||
|
||||
use crate::value::TryFromJs; |
||||
use boa_engine::{Context, JsResult, JsValue}; |
||||
use either::Either; |
||||
|
||||
impl<L, R> TryFromJs for Either<L, R> |
||||
where |
||||
L: TryFromJs, |
||||
R: TryFromJs, |
||||
{ |
||||
#[inline] |
||||
fn try_from_js(value: &JsValue, context: &mut Context) -> JsResult<Self> { |
||||
L::try_from_js(value, context) |
||||
.map(Self::Left) |
||||
.or_else(|_| R::try_from_js(value, context).map(Self::Right)) |
||||
} |
||||
} |
||||
|
||||
#[test] |
||||
fn either() { |
||||
let v = JsValue::Integer(123); |
||||
let mut context = Context::default(); |
||||
|
||||
assert_eq!( |
||||
Either::<i32, i32>::try_from_js(&v, &mut context), |
||||
Ok(Either::Left(123)) |
||||
); |
||||
assert_eq!( |
||||
Either::<i32, String>::try_from_js(&v, &mut context), |
||||
Ok(Either::Left(123)) |
||||
); |
||||
assert_eq!( |
||||
Either::<String, i32>::try_from_js(&v, &mut context), |
||||
Ok(Either::Right(123)) |
||||
); |
||||
assert!(Either::<String, String>::try_from_js(&v, &mut context).is_err()); |
||||
} |
Loading…
Reference in new issue