use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct Producer {
pub tool: String,
pub version: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub git_commit: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub features: Vec<String>,
}
impl Producer {
pub fn powerio() -> Self {
Self {
tool: "powerio".to_owned(),
version: env!("CARGO_PKG_VERSION").to_owned(),
git_commit: None,
features: Vec::new(),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
#[non_exhaustive]
pub enum Origin {
InMemory,
File {
path: String,
format: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
hash: Option<String>,
#[serde(default)]
retained_source: bool,
},
Folder {
path: String,
format: String,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
file_hashes: BTreeMap<String, String>,
},
BinaryFile {
path: String,
format: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
hash: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
decoded_sections: Vec<String>,
},
Derived {
#[serde(default, skip_serializing_if = "Option::is_none")]
parent_package_id: Option<String>,
pass: String,
#[serde(default, skip_serializing_if = "serde_json::Map::is_empty")]
options: serde_json::Map<String, serde_json::Value>,
},
Composite { sources: Vec<String> },
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SourceDescriptor {
pub id: String,
pub kind: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hash: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SourceRef {
pub source_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub line: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub column: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub byte_offset: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub record: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub field: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub raw_token: Option<String>,
}
impl SourceRef {
pub fn new(source_id: impl Into<String>) -> Self {
Self {
source_id: source_id.into(),
line: None,
column: None,
byte_offset: None,
record: None,
field: None,
raw_token: None,
}
}
#[must_use]
pub fn with_field(mut self, field: impl Into<String>) -> Self {
self.field = Some(field.into());
self
}
#[must_use]
pub fn with_record(mut self, record: impl Into<String>) -> Self {
self.record = Some(record.into());
self
}
#[must_use]
pub fn with_line(mut self, line: u32) -> Self {
self.line = Some(line);
self
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum MappingKind {
Exact,
Defaulted,
Inferred,
ConvertedUnits,
Lowered,
Aggregated,
Split,
Synthetic,
RetainedExtra,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Confidence {
Exact,
High,
Medium,
Low,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SourceMapEntry {
pub element_path: String,
pub source_ref: SourceRef,
pub mapping_kind: MappingKind,
pub confidence: Confidence,
}