#[cfg(feature = "json_schema")]
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use super::AssertionMetadata;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
pub struct Coordinate {
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
#[serde(rename_all = "camelCase")]
pub enum ShapeType {
Rectangle,
Circle,
Polygon,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
#[serde(rename_all = "camelCase")]
pub enum UnitType {
Pixel,
Percent,
}
#[skip_serializing_none]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
pub struct Shape {
#[serde(rename = "type")]
pub shape_type: ShapeType,
pub unit: UnitType,
pub origin: Coordinate,
pub width: Option<f64>,
pub height: Option<f64>,
pub inside: Option<bool>,
pub vertices: Option<Vec<Coordinate>>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
#[serde(rename_all = "camelCase")]
pub enum TimeType {
#[default]
Npt,
}
#[skip_serializing_none]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
pub struct Time {
#[serde(rename = "type", default)]
pub time_type: TimeType,
pub start: Option<String>,
pub end: Option<String>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
pub struct Frame {
pub start: Option<i32>,
pub end: Option<i32>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
pub struct TextSelector {
pub fragment: String,
pub start: Option<i32>,
pub end: Option<i32>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
pub struct TextSelectorRange {
pub selector: TextSelector,
pub end: Option<TextSelector>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
pub struct Text {
pub selectors: Vec<TextSelectorRange>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
pub struct Item {
pub identifier: String,
pub value: String,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
#[serde(rename_all = "camelCase")]
pub enum RangeType {
Spatial,
#[default]
Temporal,
Frame,
Textual,
Identified,
}
#[skip_serializing_none]
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
pub struct Range {
#[serde(rename = "type")]
pub range_type: RangeType,
pub shape: Option<Shape>,
pub time: Option<Time>,
pub frame: Option<Frame>,
pub text: Option<Text>,
pub item: Option<Item>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
#[serde(rename_all = "camelCase")]
pub enum Role {
#[serde(rename = "c2pa.areaOfInterest")]
AreaOfInterest,
#[serde(rename = "c2pa.cropped")]
Cropped,
#[serde(rename = "c2pa.edited")]
Edited,
#[serde(rename = "c2pa.placed")]
Placed,
#[serde(rename = "c2pa.redacted")]
Redacted,
#[serde(rename = "c2pa.subjectArea")]
SubjectArea,
#[serde(rename = "c2pa.deleted")]
Deleted,
#[serde(rename = "c2pa.styled")]
Styled,
#[serde(rename = "c2pa.watermarked")]
Watermarked,
}
#[skip_serializing_none]
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "json_schema", derive(JsonSchema))]
pub struct RegionOfInterest {
pub region: Vec<Range>,
pub name: Option<String>,
pub identifier: Option<String>,
#[serde(rename = "type")]
pub region_type: Option<String>,
pub role: Option<Role>,
pub description: Option<String>,
pub metadata: Option<Box<AssertionMetadata>>,
}