Đặc điểm rỉ sét không hài lòng
Tôi mới làm quen với gỉ và đã thử tìm kiếm trong stackoverflow cũng như đọc tài liệu về serde https://docs.serde.rs/serde/trait.Serialize.html và https://serde.rs/impl-serialize.html, nhưng tôi đã hơi lạc lối.
Tôi muốn sử dụng Tera để tạo html và cấu trúc tôi đang chuyển nó không có đặc điểm được serde::ser::Serialize
triển khai và tôi đã cố gắng triển khai nó nhưng nó có vẻ không ổn.
Phụ thuộc Cargo.toml
serde = "1.0.115"
serde_derive = "1.0.115"
serde-xml-rs = "0.4.0"
tera = "0.7.2"
main.rs
extern crate tera;
#[macro_use]
extern crate serde_derive;
extern crate serde;
use tera::Context;
use serde::ser::{Serialize, SerializeStruct, Serializer};
#[derive(Serialize, Debug)]
struct Person {
firstname: String,
lastname: String,
age: i32,
}
#[derive(Debug)]
struct Attendees {
people: Vec<Person>,
updatedOn: String,
updatedBy: String,
}
impl Serialize for Attendees {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut s = serializer.serialize_struct("Person", 3)?;
s.serialize_field("people", &self.people)?;
s.serialize_field("updatedOn", &self.updatedOn)?;
s.serialize_field("updatedBy", &self.updatedBy)?;
s.end()
}
}
fn main() {
let mut context = Context::new();
let mut peeps: Vec<Person> = Vec::new();
let mut attendees = Attendees {
people: peeps,
updatedOn: String::from("today"),
updatedBy: String::from("someone"),
};
context.add("attendees", &attendees);
}
trình biên dịch nói:
mytest % cargo run
Compiling mytest v0.1.0 (/home/mike/mytest)
error[E0277]: the trait bound `Attendees: serde::ser::Serialize` is not satisfied
--> src/main.rs:44:29
|
44 | context.add("attendees", &attendees);
| ^^^^^^^^^^ the trait `serde::ser::Serialize` is not implemented for `Attendees`
error: aborting due to previous error
Tôi rõ ràng đang thiếu một cái gì đó ... Bất cứ ai có thể vui lòng giúp đỡ?
Trả lời
Đặc điểm bạn đã triển khai và đặc điểm mà lỗi đang đề cập đến không giống nhau, bởi vì chúng đề cập đến hai phiên bản khác nhau của serde.
[[package]]
name = "tera"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c37e2aaa53871f9c3722a20f8951fea0afd366955e11542a58feb71997c6d769"
dependencies = [
"chrono",
"error-chain",
"glob",
"humansize",
"lazy_static 0.2.11",
"pest",
"regex",
"serde 0.9.15",
"serde_json",
"slug",
"url",
]
tera 0.7.2
không sử dụng phiên bản 1.0.*
của serde, nhưng 0.9.*
.
Bạn có thể sử dụng tera mới hơn hoặc sử dụng phiên bản serde tương thích trong Cargo.toml của bạn:
[dependencies]
serde = "0.9.15"
serde_derive = "0.9.15"