1use std::collections::BTreeMap;
8
9use serde::{Deserialize, Serialize};
10
11#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
13pub struct Producer {
14 pub tool: String,
15 pub version: String,
16 #[serde(default, skip_serializing_if = "Option::is_none")]
17 pub git_commit: Option<String>,
18 #[serde(default, skip_serializing_if = "Vec::is_empty")]
19 pub features: Vec<String>,
20}
21
22impl Producer {
23 pub fn powerio() -> Self {
25 Self {
26 tool: "powerio".to_owned(),
27 version: env!("CARGO_PKG_VERSION").to_owned(),
28 git_commit: None,
29 features: Vec::new(),
30 }
31 }
32}
33
34#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
41#[serde(tag = "kind", rename_all = "snake_case")]
42#[non_exhaustive]
43pub enum Origin {
44 InMemory,
46 File {
47 path: String,
48 format: String,
49 #[serde(default, skip_serializing_if = "Option::is_none")]
50 hash: Option<String>,
51 #[serde(default)]
55 retained_source: bool,
56 },
57 Folder {
58 path: String,
59 format: String,
60 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
61 file_hashes: BTreeMap<String, String>,
62 },
63 BinaryFile {
64 path: String,
65 format: String,
66 #[serde(default, skip_serializing_if = "Option::is_none")]
67 hash: Option<String>,
68 #[serde(default, skip_serializing_if = "Vec::is_empty")]
69 decoded_sections: Vec<String>,
70 },
71 Derived {
73 #[serde(default, skip_serializing_if = "Option::is_none")]
74 parent_package_id: Option<String>,
75 pass: String,
76 #[serde(default, skip_serializing_if = "serde_json::Map::is_empty")]
77 options: serde_json::Map<String, serde_json::Value>,
78 },
79 Composite { sources: Vec<String> },
81}
82
83#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
86pub struct SourceDescriptor {
87 pub id: String,
88 pub kind: String,
89 #[serde(default, skip_serializing_if = "Option::is_none")]
90 pub path: Option<String>,
91 #[serde(default, skip_serializing_if = "Option::is_none")]
92 pub format: Option<String>,
93 #[serde(default, skip_serializing_if = "Option::is_none")]
94 pub hash: Option<String>,
95}
96
97#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
99pub struct SourceRef {
100 pub source_id: String,
101 #[serde(default, skip_serializing_if = "Option::is_none")]
102 pub line: Option<u32>,
103 #[serde(default, skip_serializing_if = "Option::is_none")]
104 pub column: Option<u32>,
105 #[serde(default, skip_serializing_if = "Option::is_none")]
107 pub byte_offset: Option<u64>,
108 #[serde(default, skip_serializing_if = "Option::is_none")]
110 pub record: Option<String>,
111 #[serde(default, skip_serializing_if = "Option::is_none")]
113 pub field: Option<String>,
114 #[serde(default, skip_serializing_if = "Option::is_none")]
116 pub raw_token: Option<String>,
117}
118
119impl SourceRef {
120 pub fn new(source_id: impl Into<String>) -> Self {
122 Self {
123 source_id: source_id.into(),
124 line: None,
125 column: None,
126 byte_offset: None,
127 record: None,
128 field: None,
129 raw_token: None,
130 }
131 }
132
133 #[must_use]
135 pub fn with_field(mut self, field: impl Into<String>) -> Self {
136 self.field = Some(field.into());
137 self
138 }
139
140 #[must_use]
142 pub fn with_record(mut self, record: impl Into<String>) -> Self {
143 self.record = Some(record.into());
144 self
145 }
146
147 #[must_use]
149 pub fn with_line(mut self, line: u32) -> Self {
150 self.line = Some(line);
151 self
152 }
153}
154
155#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
157#[serde(rename_all = "snake_case")]
158#[non_exhaustive]
159pub enum MappingKind {
160 Exact,
162 Defaulted,
164 Inferred,
166 ConvertedUnits,
168 Lowered,
170 Aggregated,
172 Split,
174 Synthetic,
176 RetainedExtra,
178}
179
180#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
182#[serde(rename_all = "snake_case")]
183pub enum Confidence {
184 Exact,
185 High,
186 Medium,
187 Low,
188}
189
190#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
192pub struct SourceMapEntry {
193 pub element_path: String,
195 pub source_ref: SourceRef,
196 pub mapping_kind: MappingKind,
197 pub confidence: Confidence,
198}