Как объединить типы из разных библиотек в Rust? - PullRequest
0 голосов
/ 02 июля 2018

Я использую библиотеки Rust swtweb (для взаимодействия с JavaScript) и serde-json (для работы с JSON). Оба имеют тип Value для представления объектов JavaScript, которые очень похожи:

swtweb's Value:

#[derive(Clone, PartialEq, Debug)]
pub enum Value {
    Undefined,
    Null,
    Bool(bool),
    Number(Number),
    Symbol(Symbol),
    String(String),
    Reference(Reference)
}

и serde-json's Value:

#[derive(Clone, PartialEq)]
pub enum Value {
    Null,
    Bool(bool),
    Number(Number),
    String(String),
    Array(Vec<Value>),
    Object(Map<String, Value>),
}

Каков подход к преобразованию экземпляров одного типа в другой? Можно ли вывести общую черту без изменения библиотек?

1 Ответ

0 голосов
/ 03 июля 2018

Глядя на документ stdweb::Value, кажется, они вас охватили!

Он реализует TryFrom<JsonValue>, с псевдонимом JsonValue, равным serde_json::Value, так что это позволяет вам конвертировать из serde_json::Value в stdweb::Value.

Он реализует Serialize, а serde_json::to_value позволяет преобразовывать любой тип, который реализует Serialize, в serde_json::Value

Так что это должно работать:

let json_value: serde_json::Value = json!("my value");
println!("{:#?}", json_value);

let stdweb_value: stdweb::Value = stdweb::Value::try_from(json_value).unwrap();
println!("{:#?}", stdweb_value);

let json_value_again: serde_json::Value = serde_json::to_value(stdweb_value).unwrap();
println!("{:#?}", json_value_again);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...