use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::author::AuthorStamp;
use crate::ids::{ProjectId, TenantId};
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(transparent)]
pub struct EvidenceId(pub String);
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Evidence {
pub id: EvidenceId,
pub tenant_id: TenantId,
pub project_id: ProjectId,
pub source_uri: String,
pub source_type: String,
pub source_id: String,
pub content: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub char_start: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub char_end: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub byte_start: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub byte_end: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub observed_at: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extracted_at: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extractor_version: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub confidence: Option<f32>,
#[serde(default, skip_serializing_if = "serde_json::Value::is_null")]
pub metadata: serde_json::Value,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub author: Option<AuthorStamp>,
}
impl Evidence {
pub fn quick(
id: &str,
tenant: TenantId,
project: ProjectId,
source_type: &str,
source_id: &str,
content: &str,
) -> Self {
Self {
id: EvidenceId(id.to_string()),
tenant_id: tenant,
project_id: project,
source_uri: format!("antares://{source_type}/{source_id}"),
source_type: source_type.to_string(),
source_id: source_id.to_string(),
content: content.to_string(),
char_start: None,
char_end: None,
byte_start: None,
byte_end: None,
observed_at: None,
extracted_at: None,
extractor_version: None,
confidence: None,
metadata: serde_json::Value::Null,
author: None,
}
}
}