Rostmerkmal nicht erfüllt
Ich bin neu im Rosten und habe versucht, im Stackoverflow zu suchen und die serde-Dokumentation zu lesen https://docs.serde.rs/serde/trait.Serialize.html und https://serde.rs/impl-serialize.html, aber ich war ein bisschen verloren.
Ich möchte Tera verwenden, um HTML zu generieren, und in der Struktur, die ich übergebe, ist das Merkmal nicht serde::ser::Serializeimplementiert, und ich habe versucht, es zu implementieren, aber es scheint nicht ganz richtig zu sein.
Cargo.toml-Abhängigkeiten
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);
}
Compiler sagt:
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
Mir fehlt eindeutig etwas ... Kann mir bitte jemand helfen?
Antworten
Das von Ihnen implementierte Merkmal und das Merkmal, auf das sich der Fehler bezieht, sind nicht dasselbe, da sie sich auf zwei verschiedene Versionen von serde beziehen.
[[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 verwendet 0.7.2aber nicht die version 1.0.*von serde 0.9.*.
Sie können eine neuere Version von tera oder eine kompatible serde-Version in Ihrer Cargo.toml verwenden:
[dependencies]
serde = "0.9.15"
serde_derive = "0.9.15"