Skip to main content

dm_database_sqllog2db/pipeline/
output_config.rs

1use serde::Deserialize;
2
3use super::field_mask::{FIELD_NAMES, FieldMask};
4
5/// `[output]` 配置段:字段投影
6#[derive(Debug, Deserialize, Clone, Default)]
7pub struct OutputConfig {
8    /// 字段投影:仅导出指定字段,默认为全部 15 个字段
9    #[serde(default)]
10    pub fields: Option<Vec<String>>,
11}
12
13impl OutputConfig {
14    /// 计算字段投影掩码。字段名在 `validate()` 阶段已验证,无效名称静默退化为全量掩码。
15    #[must_use]
16    pub fn field_mask(&self) -> FieldMask {
17        match &self.fields {
18            None => FieldMask::ALL,
19            Some(names) if names.is_empty() => FieldMask::ALL,
20            Some(names) => FieldMask::from_names(names).unwrap_or(FieldMask::ALL),
21        }
22    }
23
24    /// 按用户配置顺序返回字段索引列表,供 exporter 写入时按序遍历。
25    #[must_use]
26    pub fn ordered_field_indices(&self) -> Vec<usize> {
27        match &self.fields {
28            None => (0..FIELD_NAMES.len()).collect(),
29            Some(names) if names.is_empty() => (0..FIELD_NAMES.len()).collect(),
30            Some(names) => names
31                .iter()
32                .filter_map(|name| FIELD_NAMES.iter().position(|&n| n == name.as_str()))
33                .collect(),
34        }
35    }
36}