#![allow(clippy::doc_markdown)]
use serde::{Deserialize, Serialize};
use super::common::*;
#[derive(Debug, thiserror::Error, PartialEq, Eq)]
pub enum BuildError {
#[error("missing required field: {0}")]
MissingField(&'static str),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct LocalDefinitions {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub objectives_and_methods: Vec<LocalObjective>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub activities: Vec<Activity>,
#[serde(skip_serializing_if = "Option::is_none")]
pub remarks: Option<crate::primitives::MarkupMultiline>,
}
#[must_use]
#[derive(Debug)]
pub struct LocalDefinitionsBuilder {
objectives_and_methods: Vec<LocalObjective>,
activities: Vec<Activity>,
remarks: Option<crate::primitives::MarkupMultiline>,
}
impl LocalDefinitionsBuilder {
pub fn new() -> Self {
Self {
objectives_and_methods: Vec::new(),
activities: Vec::new(),
remarks: None,
}
}
}
impl Default for LocalDefinitionsBuilder {
fn default() -> Self {
Self::new()
}
}
impl LocalDefinitionsBuilder {
pub fn objectives_and_methods(mut self, v: impl Into<LocalObjective>) -> Self {
self.objectives_and_methods.push(v.into());
self
}
pub fn activities(mut self, v: impl Into<Activity>) -> Self {
self.activities.push(v.into());
self
}
pub fn remarks(mut self, v: impl Into<crate::primitives::MarkupMultiline>) -> Self {
self.remarks = Some(v.into());
self
}
pub fn build(self) -> ::core::result::Result<LocalDefinitions, BuildError> {
Ok(LocalDefinitions {
objectives_and_methods: self.objectives_and_methods,
activities: self.activities,
remarks: self.remarks,
})
}
}
impl LocalDefinitions {
pub fn builder() -> LocalDefinitionsBuilder {
LocalDefinitionsBuilder::new()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct AssessmentResults {
pub uuid: uuid::Uuid,
pub metadata: Metadata,
pub import_ap: ImportAp,
#[serde(skip_serializing_if = "Option::is_none")]
pub local_definitions: Option<LocalDefinitions>,
#[serde(default)]
pub results: Vec<OscalResult>,
#[serde(skip_serializing_if = "Option::is_none")]
pub back_matter: Option<BackMatter>,
}
#[must_use]
#[derive(Debug)]
pub struct AssessmentResultsBuilder {
uuid: Option<uuid::Uuid>,
metadata: Option<Metadata>,
import_ap: Option<ImportAp>,
local_definitions: Option<LocalDefinitions>,
results: Vec<OscalResult>,
back_matter: Option<BackMatter>,
}
impl AssessmentResultsBuilder {
pub fn new() -> Self {
Self {
uuid: None,
metadata: None,
import_ap: None,
local_definitions: None,
results: Vec::new(),
back_matter: None,
}
}
}
impl Default for AssessmentResultsBuilder {
fn default() -> Self {
Self::new()
}
}
impl AssessmentResultsBuilder {
pub fn uuid(mut self, v: impl Into<uuid::Uuid>) -> Self {
self.uuid = Some(v.into());
self
}
pub fn metadata(mut self, v: impl Into<Metadata>) -> Self {
self.metadata = Some(v.into());
self
}
pub fn import_ap(mut self, v: impl Into<ImportAp>) -> Self {
self.import_ap = Some(v.into());
self
}
pub fn local_definitions(mut self, v: impl Into<LocalDefinitions>) -> Self {
self.local_definitions = Some(v.into());
self
}
pub fn results(mut self, v: impl Into<OscalResult>) -> Self {
self.results.push(v.into());
self
}
pub fn back_matter(mut self, v: impl Into<BackMatter>) -> Self {
self.back_matter = Some(v.into());
self
}
pub fn build(self) -> ::core::result::Result<AssessmentResults, BuildError> {
let uuid = self
.uuid
.ok_or_else(|| BuildError::MissingField("required field `uuid` not set"))?;
let metadata = self
.metadata
.ok_or_else(|| BuildError::MissingField(
"required field `metadata` not set",
))?;
let import_ap = self
.import_ap
.ok_or_else(|| BuildError::MissingField(
"required field `import-ap` not set",
))?;
Ok(AssessmentResults {
uuid,
metadata,
import_ap,
local_definitions: self.local_definitions,
results: self.results,
back_matter: self.back_matter,
})
}
}
impl AssessmentResults {
pub fn builder() -> AssessmentResultsBuilder {
AssessmentResultsBuilder::new()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct Attestation {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub responsible_parties: Vec<ResponsibleParty>,
#[serde(default)]
pub parts: Vec<AssessmentPart>,
}
#[must_use]
#[derive(Debug)]
pub struct AttestationBuilder {
responsible_parties: Vec<ResponsibleParty>,
parts: Vec<AssessmentPart>,
}
impl AttestationBuilder {
pub fn new() -> Self {
Self {
responsible_parties: Vec::new(),
parts: Vec::new(),
}
}
}
impl Default for AttestationBuilder {
fn default() -> Self {
Self::new()
}
}
impl AttestationBuilder {
pub fn responsible_parties(mut self, v: impl Into<ResponsibleParty>) -> Self {
self.responsible_parties.push(v.into());
self
}
pub fn parts(mut self, v: impl Into<AssessmentPart>) -> Self {
self.parts.push(v.into());
self
}
pub fn build(self) -> ::core::result::Result<Attestation, BuildError> {
Ok(Attestation {
responsible_parties: self.responsible_parties,
parts: self.parts,
})
}
}
impl Attestation {
pub fn builder() -> AttestationBuilder {
AttestationBuilder::new()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct Entry {
pub uuid: uuid::Uuid,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<crate::primitives::MarkupLine>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<crate::primitives::MarkupMultiline>,
pub start: chrono::DateTime<chrono::Utc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end: Option<chrono::DateTime<chrono::Utc>>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub props: Vec<Property>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub links: Vec<Link>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub logged_by: Vec<LoggedBy>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub related_tasks: Vec<RelatedTask>,
#[serde(skip_serializing_if = "Option::is_none")]
pub remarks: Option<crate::primitives::MarkupMultiline>,
}
#[must_use]
#[derive(Debug)]
pub struct EntryBuilder {
uuid: Option<uuid::Uuid>,
title: Option<crate::primitives::MarkupLine>,
description: Option<crate::primitives::MarkupMultiline>,
start: Option<chrono::DateTime<chrono::Utc>>,
end: Option<chrono::DateTime<chrono::Utc>>,
props: Vec<Property>,
links: Vec<Link>,
logged_by: Vec<LoggedBy>,
related_tasks: Vec<RelatedTask>,
remarks: Option<crate::primitives::MarkupMultiline>,
}
impl EntryBuilder {
pub fn new() -> Self {
Self {
uuid: None,
title: None,
description: None,
start: None,
end: None,
props: Vec::new(),
links: Vec::new(),
logged_by: Vec::new(),
related_tasks: Vec::new(),
remarks: None,
}
}
}
impl Default for EntryBuilder {
fn default() -> Self {
Self::new()
}
}
impl EntryBuilder {
pub fn uuid(mut self, v: impl Into<uuid::Uuid>) -> Self {
self.uuid = Some(v.into());
self
}
pub fn title(mut self, v: impl Into<crate::primitives::MarkupLine>) -> Self {
self.title = Some(v.into());
self
}
pub fn description(
mut self,
v: impl Into<crate::primitives::MarkupMultiline>,
) -> Self {
self.description = Some(v.into());
self
}
pub fn start(mut self, v: impl Into<chrono::DateTime<chrono::Utc>>) -> Self {
self.start = Some(v.into());
self
}
pub fn end(mut self, v: impl Into<chrono::DateTime<chrono::Utc>>) -> Self {
self.end = Some(v.into());
self
}
pub fn props(mut self, v: impl Into<Property>) -> Self {
self.props.push(v.into());
self
}
pub fn links(mut self, v: impl Into<Link>) -> Self {
self.links.push(v.into());
self
}
pub fn logged_by(mut self, v: impl Into<LoggedBy>) -> Self {
self.logged_by.push(v.into());
self
}
pub fn related_tasks(mut self, v: impl Into<RelatedTask>) -> Self {
self.related_tasks.push(v.into());
self
}
pub fn remarks(mut self, v: impl Into<crate::primitives::MarkupMultiline>) -> Self {
self.remarks = Some(v.into());
self
}
pub fn build(self) -> ::core::result::Result<Entry, BuildError> {
let uuid = self
.uuid
.ok_or_else(|| BuildError::MissingField("required field `uuid` not set"))?;
let start = self
.start
.ok_or_else(|| BuildError::MissingField("required field `start` not set"))?;
Ok(Entry {
uuid,
title: self.title,
description: self.description,
start,
end: self.end,
props: self.props,
links: self.links,
logged_by: self.logged_by,
related_tasks: self.related_tasks,
remarks: self.remarks,
})
}
}
impl Entry {
pub fn builder() -> EntryBuilder {
EntryBuilder::new()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct AssessmentLog {
#[serde(default)]
pub entry: Vec<Entry>,
}
#[must_use]
#[derive(Debug)]
pub struct AssessmentLogBuilder {
entry: Vec<Entry>,
}
impl AssessmentLogBuilder {
pub fn new() -> Self {
Self { entry: Vec::new() }
}
}
impl Default for AssessmentLogBuilder {
fn default() -> Self {
Self::new()
}
}
impl AssessmentLogBuilder {
pub fn entry(mut self, v: impl Into<Entry>) -> Self {
self.entry.push(v.into());
self
}
pub fn build(self) -> ::core::result::Result<AssessmentLog, BuildError> {
Ok(AssessmentLog { entry: self.entry })
}
}
impl AssessmentLog {
pub fn builder() -> AssessmentLogBuilder {
AssessmentLogBuilder::new()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct OscalResult {
pub uuid: uuid::Uuid,
pub title: crate::primitives::MarkupLine,
pub description: crate::primitives::MarkupMultiline,
pub start: chrono::DateTime<chrono::Utc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end: Option<chrono::DateTime<chrono::Utc>>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub props: Vec<Property>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub links: Vec<Link>,
#[serde(skip_serializing_if = "Option::is_none")]
pub local_definitions: Option<LocalDefinitions>,
pub reviewed_controls: ReviewedControls,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub attestation: Vec<Attestation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub assessment_log: Option<AssessmentLog>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub observations: Vec<Observation>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub risks: Vec<Risk>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub findings: Vec<Finding>,
#[serde(skip_serializing_if = "Option::is_none")]
pub remarks: Option<crate::primitives::MarkupMultiline>,
}
#[must_use]
#[derive(Debug)]
pub struct OscalResultBuilder {
uuid: Option<uuid::Uuid>,
title: Option<crate::primitives::MarkupLine>,
description: Option<crate::primitives::MarkupMultiline>,
start: Option<chrono::DateTime<chrono::Utc>>,
end: Option<chrono::DateTime<chrono::Utc>>,
props: Vec<Property>,
links: Vec<Link>,
local_definitions: Option<LocalDefinitions>,
reviewed_controls: Option<ReviewedControls>,
attestation: Vec<Attestation>,
assessment_log: Option<AssessmentLog>,
observations: Vec<Observation>,
risks: Vec<Risk>,
findings: Vec<Finding>,
remarks: Option<crate::primitives::MarkupMultiline>,
}
impl OscalResultBuilder {
pub fn new() -> Self {
Self {
uuid: None,
title: None,
description: None,
start: None,
end: None,
props: Vec::new(),
links: Vec::new(),
local_definitions: None,
reviewed_controls: None,
attestation: Vec::new(),
assessment_log: None,
observations: Vec::new(),
risks: Vec::new(),
findings: Vec::new(),
remarks: None,
}
}
}
impl Default for OscalResultBuilder {
fn default() -> Self {
Self::new()
}
}
impl OscalResultBuilder {
pub fn uuid(mut self, v: impl Into<uuid::Uuid>) -> Self {
self.uuid = Some(v.into());
self
}
pub fn title(mut self, v: impl Into<crate::primitives::MarkupLine>) -> Self {
self.title = Some(v.into());
self
}
pub fn description(
mut self,
v: impl Into<crate::primitives::MarkupMultiline>,
) -> Self {
self.description = Some(v.into());
self
}
pub fn start(mut self, v: impl Into<chrono::DateTime<chrono::Utc>>) -> Self {
self.start = Some(v.into());
self
}
pub fn end(mut self, v: impl Into<chrono::DateTime<chrono::Utc>>) -> Self {
self.end = Some(v.into());
self
}
pub fn props(mut self, v: impl Into<Property>) -> Self {
self.props.push(v.into());
self
}
pub fn links(mut self, v: impl Into<Link>) -> Self {
self.links.push(v.into());
self
}
pub fn local_definitions(mut self, v: impl Into<LocalDefinitions>) -> Self {
self.local_definitions = Some(v.into());
self
}
pub fn reviewed_controls(mut self, v: impl Into<ReviewedControls>) -> Self {
self.reviewed_controls = Some(v.into());
self
}
pub fn attestation(mut self, v: impl Into<Attestation>) -> Self {
self.attestation.push(v.into());
self
}
pub fn assessment_log(mut self, v: impl Into<AssessmentLog>) -> Self {
self.assessment_log = Some(v.into());
self
}
pub fn observations(mut self, v: impl Into<Observation>) -> Self {
self.observations.push(v.into());
self
}
pub fn risks(mut self, v: impl Into<Risk>) -> Self {
self.risks.push(v.into());
self
}
pub fn findings(mut self, v: impl Into<Finding>) -> Self {
self.findings.push(v.into());
self
}
pub fn remarks(mut self, v: impl Into<crate::primitives::MarkupMultiline>) -> Self {
self.remarks = Some(v.into());
self
}
pub fn build(self) -> ::core::result::Result<OscalResult, BuildError> {
let uuid = self
.uuid
.ok_or_else(|| BuildError::MissingField("required field `uuid` not set"))?;
let title = self
.title
.ok_or_else(|| BuildError::MissingField("required field `title` not set"))?;
let description = self
.description
.ok_or_else(|| BuildError::MissingField(
"required field `description` not set",
))?;
let start = self
.start
.ok_or_else(|| BuildError::MissingField("required field `start` not set"))?;
let reviewed_controls = self
.reviewed_controls
.ok_or_else(|| BuildError::MissingField(
"required field `reviewed-controls` not set",
))?;
Ok(OscalResult {
uuid,
title,
description,
start,
end: self.end,
props: self.props,
links: self.links,
local_definitions: self.local_definitions,
reviewed_controls,
attestation: self.attestation,
assessment_log: self.assessment_log,
observations: self.observations,
risks: self.risks,
findings: self.findings,
remarks: self.remarks,
})
}
}
impl OscalResult {
pub fn builder() -> OscalResultBuilder {
OscalResultBuilder::new()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ImportAp {
pub href: crate::primitives::UriReference,
#[serde(skip_serializing_if = "Option::is_none")]
pub remarks: Option<crate::primitives::MarkupMultiline>,
}
#[must_use]
#[derive(Debug)]
pub struct ImportApBuilder {
href: Option<crate::primitives::UriReference>,
remarks: Option<crate::primitives::MarkupMultiline>,
}
impl ImportApBuilder {
pub fn new() -> Self {
Self { href: None, remarks: None }
}
}
impl Default for ImportApBuilder {
fn default() -> Self {
Self::new()
}
}
impl ImportApBuilder {
pub fn href(mut self, v: impl Into<crate::primitives::UriReference>) -> Self {
self.href = Some(v.into());
self
}
pub fn remarks(mut self, v: impl Into<crate::primitives::MarkupMultiline>) -> Self {
self.remarks = Some(v.into());
self
}
pub fn build(self) -> ::core::result::Result<ImportAp, BuildError> {
let href = self
.href
.ok_or_else(|| BuildError::MissingField("required field `href` not set"))?;
Ok(ImportAp {
href,
remarks: self.remarks,
})
}
}
impl ImportAp {
pub fn builder() -> ImportApBuilder {
ImportApBuilder::new()
}
}