rust - 对函数返回的数据创建条件视图或代理
问题描述
我有一个 JSON 对象,它代表一些松散的配置。我想提供基于某些运行时条件的数据“视图”功能,而不是直接处理数据。
在某些情况下,我仍然需要处理“原始”数据,因此我不想保留相同内容的副本和多次解析。
例如,我有一个这样的婴儿 JSON:
[
{
"type" : "banner",
"text" : "some text",
},
{
"type" : "toolbar",
"text" : "some text",
"color" : "#00FF00",
"texture" : "border",
"shadow" : "#000000"
}
]
我正在将数据解析为与此类似的对象树:
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Serialize, Deserialize, Debug, Clone)]
struct Data {
values: Vec<Message>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
struct Message {
message_type: MessageType,
text: String,
additional_fields: HashMap<String, Value>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
enum MessageType {
Banner,
Toolbar,
}
// I have some helper functions to find things in the JSON
impl Data {
pub fn get_message_of_type(&self, message_type: MessageType) -> Option<&Message> {
self.values.iter().find(|x| x.message_type == message_type)
}
}
我想要一种方法来返回与MessageType
.
例如,当消息是工具栏时,它还具有其他属性中的“颜色”属性。
我想为它定义一个特征(或其他东西?)Toolbar
并“投射” Message
(或返回一些代理)以帮助处理非常松散的Message
类型。
这是一个人为的例子
// some trait describing toolbar things
trait Toolbar {
fn text() -> String;
fn color() -> String;
fn something_only_toolbar_relevant();
}
// NOT FUNCTIONING! This is what I am trying to figure out
impl Toolbar for Message
where
message_type = "toolbar"
{
fn text() -> String {
self.text
}
fn color() -> String {
let color = self.additional_fields.get("color");
self.additional_fields.get("color").unwrap.as_str()
}
}
// extend the Data class to return "toolbars"
// DOES NOT WORK!!! I am asking how to do this
// SHOULD I CREATE A SHIM OBJECT TO PROXY THIS FUNCTIONALITY?
// IS THERE A LOW COST MECHANISM TO DO THIS WITHOUT CREATING NEW OBJECTS?
impl Data {
fn get_toolbar(&self) -> impl Toolbar {
json.find(|x| x.message_type == MessageType::Toolbar) ????AS???? Toolbar // a view over the object for a toolbar
}
}
解决方案
推荐阅读
- python - 在python中仅提取pdf的第一行
- java - 为什么宽度为1的fillRect与drawLine不同
- reactjs - @react-google-maps/api 自动完成将结果严格限制在具有边界的特定区域
- c# - 保存 EF Core 上下文时插入的重复值
- reactjs - 添加后:将 const USER_NAME_SESSION_ATTRIBUTE_NAME='authenticatedUser 导出到 reactjs 中的类
- python-3.x - LU 分解速度与传统 Ax=b
- powershell - ForEach-Object循环中的Powershell“Move-Item:该进程无法访问该文件,因为它正被另一个进程使用”
- excel - Python 3.9,Pandas - 如何在现有的 excel 中附加数据框
- amazon-web-services - 在 AWS Cloudformation 控制台中获取完整的事件文本
- java - 尝试根据用户输入调用方法,然后在 IF 语句内部调用进一步的输入选项