1use std::collections::BTreeMap;
8
9use serde::{Deserialize, Serialize};
10
11#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
13#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
14pub struct Producer {
15 pub tool: String,
16 pub version: String,
17 #[serde(default, skip_serializing_if = "Option::is_none")]
18 pub git_commit: Option<String>,
19 #[serde(default, skip_serializing_if = "Vec::is_empty")]
20 pub features: Vec<String>,
21}
22
23impl Producer {
24 pub fn powerio() -> Self {
26 Self {
27 tool: "powerio".to_owned(),
28 version: env!("CARGO_PKG_VERSION").to_owned(),
29 git_commit: None,
30 features: Vec::new(),
31 }
32 }
33}
34
35#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
42#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
43#[serde(tag = "kind", rename_all = "snake_case")]
44#[non_exhaustive]
45pub enum Origin {
46 InMemory,
48 File {
49 path: String,
50 format: String,
51 #[serde(default, skip_serializing_if = "Option::is_none")]
52 hash: Option<String>,
53 #[serde(default)]
57 retained_source: bool,
58 },
59 Folder {
60 path: String,
61 format: String,
62 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
63 file_hashes: BTreeMap<String, String>,
64 },
65 BinaryFile {
66 path: String,
67 format: String,
68 #[serde(default, skip_serializing_if = "Option::is_none")]
69 hash: Option<String>,
70 #[serde(default, skip_serializing_if = "Vec::is_empty")]
71 decoded_sections: Vec<String>,
72 },
73 Derived {
75 #[serde(default, skip_serializing_if = "Option::is_none")]
76 parent_package_id: Option<String>,
77 pass: String,
78 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty")]
79 options: serde_json::Map<String, serde_json::Value>,
80 },
81 Composite { sources: Vec<String> },
83}
84
85#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
88#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
89pub struct SourceDescriptor {
90 pub id: String,
91 pub kind: String,
92 #[serde(default, skip_serializing_if = "Option::is_none")]
93 pub path: Option<String>,
94 #[serde(default, skip_serializing_if = "Option::is_none")]
95 pub format: Option<String>,
96 #[serde(default, skip_serializing_if = "Option::is_none")]
97 pub hash: Option<String>,
98}
99
100#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
102#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
103pub struct SourceRef {
104 pub source_id: String,
105 #[serde(default, skip_serializing_if = "Option::is_none")]
106 pub line: Option<u32>,
107 #[serde(default, skip_serializing_if = "Option::is_none")]
108 pub column: Option<u32>,
109 #[serde(default, skip_serializing_if = "Option::is_none")]
111 pub byte_offset: Option<u64>,
112 #[serde(default, skip_serializing_if = "Option::is_none")]
114 pub record: Option<String>,
115 #[serde(default, skip_serializing_if = "Option::is_none")]
117 pub field: Option<String>,
118 #[serde(default, skip_serializing_if = "Option::is_none")]
120 pub raw_token: Option<String>,
121}
122
123impl SourceRef {
124 pub fn new(source_id: impl Into<String>) -> Self {
126 Self {
127 source_id: source_id.into(),
128 line: None,
129 column: None,
130 byte_offset: None,
131 record: None,
132 field: None,
133 raw_token: None,
134 }
135 }
136
137 #[must_use]
139 pub fn with_field(mut self, field: impl Into<String>) -> Self {
140 self.field = Some(field.into());
141 self
142 }
143
144 #[must_use]
146 pub fn with_record(mut self, record: impl Into<String>) -> Self {
147 self.record = Some(record.into());
148 self
149 }
150
151 #[must_use]
153 pub fn with_line(mut self, line: u32) -> Self {
154 self.line = Some(line);
155 self
156 }
157}
158
159#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
161#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
162#[serde(rename_all = "snake_case")]
163#[non_exhaustive]
164pub enum MappingKind {
165 Exact,
167 Defaulted,
169 Inferred,
171 ConvertedUnits,
173 Lowered,
175 Aggregated,
177 Split,
179 Synthetic,
181 RetainedExtra,
183}
184
185#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
187#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
188#[serde(rename_all = "snake_case")]
189pub enum Confidence {
190 Exact,
191 High,
192 Medium,
193 Low,
194}
195
196#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
198#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
199pub struct SourceMapEntry {
200 pub element_path: String,
202 pub source_ref: SourceRef,
203 pub mapping_kind: MappingKind,
204 pub confidence: Confidence,
205}