我这里有个模特:

#[derive(Debug, Serialize, Deserialize)]
pub struct ArticleModel {
        #[serde(rename = "_id", skip_serializing_if = "Option::is_none")]
        pub id: Option<ObjectId>,
        pub text: String,
        pub author: String,
        pub edited_date: Option<DateTime<Utc>>,
        pub posted_date: Option<DateTime<Utc>>,
        pub is_archived: bool,
        pub tags: Vec<String>,
        pub read_time_in_min: i32, // <-- Take note of this field
        pub word_count: i32, // <-- Take note of this field
    }

在我的API处理程序中,我try 将请求的正文转换为如下形式:

#[post("/article")]
pub async fn create_article(
    data: Data<ArticleRepo>,
    new_article: Json<ArticleModel>, // <-- HERE, using Json extractor
) -> HttpResponse {
    let mut created_article = new_article.into_inner(); // <-- HERE getting its value
    created_article.id = None;

    let article_detail = data.create_article_repo(created_article).await;

    match article_detail {
        Ok(article) => HttpResponse::Ok().json(article),
        Err(err) => HttpResponse::InternalServerError().body(err.to_string()),
    }
}

除了,我不想在请求体中向上传递字段read_time_in_minword_count.我正在试着根据text字段的内容来计算它们.这些函数将&text作为输入,并输出i32.

我想不出该怎么解决这个问题.我曾考虑创建一个ArticleModel impl块,它有一个关联的new函数,该函数接受所需的参数,然后输出一个具有计算值的Self的新实例,但是,我不能从我的处理程序反序列化ArticleModel,因为我必须反序列化为struct,并且不能在那里调用new函数.我还没有传递请求正文中的两个计算字段,这意味着它将返回一个json解析错误.

我怎么才能绕过这个问题呢?

推荐答案

Credit to @Kendas for the solution from comments

我为类型ArticleModel实现了From特征,它将在API处理程序ArticleDeserializableModel中转换我期望的新类型,并将其转换为我在内部使用的可存储ArticleModel,然后允许我包括计算.

impl From<ArticleDeserializableModel> for ArticleModel {
    fn from(article_deserializable_model: ArticleDeserializableModel) -> ArticleModel {
        ArticleModel {
            id: None,
            text: article_deserializable_model.text.to_owned(),
            author: article_deserializable_model.author,
            edited_date: None,
            posted_date: None,
            is_archived: article_deserializable_model.is_archived,
            tags: article_deserializable_model.tags,
            read_time_in_min: ArticleModel::word_count_to_read_time_in_min(
                ArticleModel::count_words(&article_deserializable_model.text),
            ),
            word_count: ArticleModel::count_words(&article_deserializable_model.text),
        }
    }
} 

Rust相关问答推荐

当为a Self:IntoIterator设置trait bind `时,获取`a T `不是迭代器"&'"<'>&'

我怎样才能从一个Rust 的日期中go 掉3年?

Rust TcpStream不能在读取后写入,但可以在不读取的情况下写入.为什么?

什么时候铁 rust FFI边界上的panic 是未定义的行为?

在不重写/专门化整个函数的情况下添加单个匹配手臂到特征的方法?

如何计算迭代器适配器链中过滤的元素的数量

S在Cargo.toml中添加工作空间开发依赖关系的正确方法是什么?

如何使用RefCell::JOYMOMTborrow 对 struct 不同字段的可变引用

完全匹配包含大小写的整数范围(&Q;)

Rust将String上的迭代器转换为&;[&;str]

Rust 中的静态引用

从现有系列和 map 值创建新系列

是否可以预测堆栈溢出?

使用方法、关联函数和自由函数在 Rust 中初始化函数指针之间的区别

我可以在不调用 .clone() 的情况下在类型转换期间重用 struct 字段吗?

以下打印数组每个元素的 Rust 代码有什么问题?

为什么我不能为 Display+Debug 的泛型类型实现 std::error::Error 但有一个不是泛型参数的类型?

如何在 Rust 中构建一个 str

为什么这里需要类型注解?

在同一向量 Rust 中用另一个字符串扩展一个字符串