#![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 ComponentDefinition {
pub uuid: uuid::Uuid,
pub metadata: Metadata,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub import_component_definitions: Vec<ImportComponentDefinition>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub components: Vec<DefinedComponent>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub capabilities: Vec<Capability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub back_matter: Option<BackMatter>,
}
#[must_use]
#[derive(Debug)]
pub struct ComponentDefinitionBuilder {
uuid: Option<uuid::Uuid>,
metadata: Option<Metadata>,
import_component_definitions: Vec<ImportComponentDefinition>,
components: Vec<DefinedComponent>,
capabilities: Vec<Capability>,
back_matter: Option<BackMatter>,
}
impl ComponentDefinitionBuilder {
pub fn new() -> Self {
Self {
uuid: None,
metadata: None,
import_component_definitions: Vec::new(),
components: Vec::new(),
capabilities: Vec::new(),
back_matter: None,
}
}
}
impl Default for ComponentDefinitionBuilder {
fn default() -> Self {
Self::new()
}
}
impl ComponentDefinitionBuilder {
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_component_definitions(
mut self,
v: impl Into<ImportComponentDefinition>,
) -> Self {
self.import_component_definitions.push(v.into());
self
}
pub fn components(mut self, v: impl Into<DefinedComponent>) -> Self {
self.components.push(v.into());
self
}
pub fn capabilities(mut self, v: impl Into<Capability>) -> Self {
self.capabilities.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<ComponentDefinition, 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",
))?;
Ok(ComponentDefinition {
uuid,
metadata,
import_component_definitions: self.import_component_definitions,
components: self.components,
capabilities: self.capabilities,
back_matter: self.back_matter,
})
}
}
impl ComponentDefinition {
pub fn builder() -> ComponentDefinitionBuilder {
ComponentDefinitionBuilder::new()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ImportComponentDefinition {
pub href: crate::primitives::UriReference,
#[serde(skip_serializing_if = "Option::is_none")]
pub remarks: Option<crate::primitives::MarkupMultiline>,
}
#[must_use]
#[derive(Debug)]
pub struct ImportComponentDefinitionBuilder {
href: Option<crate::primitives::UriReference>,
remarks: Option<crate::primitives::MarkupMultiline>,
}
impl ImportComponentDefinitionBuilder {
pub fn new() -> Self {
Self { href: None, remarks: None }
}
}
impl Default for ImportComponentDefinitionBuilder {
fn default() -> Self {
Self::new()
}
}
impl ImportComponentDefinitionBuilder {
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<ImportComponentDefinition, BuildError> {
let href = self
.href
.ok_or_else(|| BuildError::MissingField("required field `href` not set"))?;
Ok(ImportComponentDefinition {
href,
remarks: self.remarks,
})
}
}
impl ImportComponentDefinition {
pub fn builder() -> ImportComponentDefinitionBuilder {
ImportComponentDefinitionBuilder::new()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct DefinedComponent {
pub uuid: uuid::Uuid,
pub title: crate::primitives::MarkupLine,
pub description: crate::primitives::MarkupMultiline,
#[serde(skip_serializing_if = "Option::is_none")]
pub purpose: Option<crate::primitives::MarkupLine>,
#[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 responsible_roles: Vec<ResponsibleRole>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub protocols: Vec<Protocol>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub control_implementations: Vec<ControlImplementation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub remarks: Option<crate::primitives::MarkupMultiline>,
}
#[must_use]
#[derive(Debug)]
pub struct DefinedComponentBuilder {
uuid: Option<uuid::Uuid>,
title: Option<crate::primitives::MarkupLine>,
description: Option<crate::primitives::MarkupMultiline>,
purpose: Option<crate::primitives::MarkupLine>,
props: Vec<Property>,
links: Vec<Link>,
responsible_roles: Vec<ResponsibleRole>,
protocols: Vec<Protocol>,
control_implementations: Vec<ControlImplementation>,
remarks: Option<crate::primitives::MarkupMultiline>,
}
impl DefinedComponentBuilder {
pub fn new() -> Self {
Self {
uuid: None,
title: None,
description: None,
purpose: None,
props: Vec::new(),
links: Vec::new(),
responsible_roles: Vec::new(),
protocols: Vec::new(),
control_implementations: Vec::new(),
remarks: None,
}
}
}
impl Default for DefinedComponentBuilder {
fn default() -> Self {
Self::new()
}
}
impl DefinedComponentBuilder {
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 purpose(mut self, v: impl Into<crate::primitives::MarkupLine>) -> Self {
self.purpose = 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 responsible_roles(mut self, v: impl Into<ResponsibleRole>) -> Self {
self.responsible_roles.push(v.into());
self
}
pub fn protocols(mut self, v: impl Into<Protocol>) -> Self {
self.protocols.push(v.into());
self
}
pub fn control_implementations(
mut self,
v: impl Into<ControlImplementation>,
) -> Self {
self.control_implementations.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<DefinedComponent, 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",
))?;
Ok(DefinedComponent {
uuid,
title,
description,
purpose: self.purpose,
props: self.props,
links: self.links,
responsible_roles: self.responsible_roles,
protocols: self.protocols,
control_implementations: self.control_implementations,
remarks: self.remarks,
})
}
}
impl DefinedComponent {
pub fn builder() -> DefinedComponentBuilder {
DefinedComponentBuilder::new()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct Capability {
pub uuid: uuid::Uuid,
pub name: String,
pub description: crate::primitives::MarkupMultiline,
#[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 incorporates_components: Vec<IncorporatesComponent>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub control_implementations: Vec<ControlImplementation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub remarks: Option<crate::primitives::MarkupMultiline>,
}
#[must_use]
#[derive(Debug)]
pub struct CapabilityBuilder {
uuid: Option<uuid::Uuid>,
name: Option<String>,
description: Option<crate::primitives::MarkupMultiline>,
props: Vec<Property>,
links: Vec<Link>,
incorporates_components: Vec<IncorporatesComponent>,
control_implementations: Vec<ControlImplementation>,
remarks: Option<crate::primitives::MarkupMultiline>,
}
impl CapabilityBuilder {
pub fn new() -> Self {
Self {
uuid: None,
name: None,
description: None,
props: Vec::new(),
links: Vec::new(),
incorporates_components: Vec::new(),
control_implementations: Vec::new(),
remarks: None,
}
}
}
impl Default for CapabilityBuilder {
fn default() -> Self {
Self::new()
}
}
impl CapabilityBuilder {
pub fn uuid(mut self, v: impl Into<uuid::Uuid>) -> Self {
self.uuid = Some(v.into());
self
}
pub fn name(mut self, v: impl Into<String>) -> Self {
self.name = Some(v.into());
self
}
pub fn description(
mut self,
v: impl Into<crate::primitives::MarkupMultiline>,
) -> Self {
self.description = 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 incorporates_components(
mut self,
v: impl Into<IncorporatesComponent>,
) -> Self {
self.incorporates_components.push(v.into());
self
}
pub fn control_implementations(
mut self,
v: impl Into<ControlImplementation>,
) -> Self {
self.control_implementations.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<Capability, BuildError> {
let uuid = self
.uuid
.ok_or_else(|| BuildError::MissingField("required field `uuid` not set"))?;
let name = self
.name
.ok_or_else(|| BuildError::MissingField("required field `name` not set"))?;
let description = self
.description
.ok_or_else(|| BuildError::MissingField(
"required field `description` not set",
))?;
Ok(Capability {
uuid,
name,
description,
props: self.props,
links: self.links,
incorporates_components: self.incorporates_components,
control_implementations: self.control_implementations,
remarks: self.remarks,
})
}
}
impl Capability {
pub fn builder() -> CapabilityBuilder {
CapabilityBuilder::new()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct IncorporatesComponent {
pub component_uuid: uuid::Uuid,
pub description: crate::primitives::MarkupMultiline,
}
#[must_use]
#[derive(Debug)]
pub struct IncorporatesComponentBuilder {
component_uuid: Option<uuid::Uuid>,
description: Option<crate::primitives::MarkupMultiline>,
}
impl IncorporatesComponentBuilder {
pub fn new() -> Self {
Self {
component_uuid: None,
description: None,
}
}
}
impl Default for IncorporatesComponentBuilder {
fn default() -> Self {
Self::new()
}
}
impl IncorporatesComponentBuilder {
pub fn component_uuid(mut self, v: impl Into<uuid::Uuid>) -> Self {
self.component_uuid = Some(v.into());
self
}
pub fn description(
mut self,
v: impl Into<crate::primitives::MarkupMultiline>,
) -> Self {
self.description = Some(v.into());
self
}
pub fn build(self) -> ::core::result::Result<IncorporatesComponent, BuildError> {
let component_uuid = self
.component_uuid
.ok_or_else(|| BuildError::MissingField(
"required field `component-uuid` not set",
))?;
let description = self
.description
.ok_or_else(|| BuildError::MissingField(
"required field `description` not set",
))?;
Ok(IncorporatesComponent {
component_uuid,
description,
})
}
}
impl IncorporatesComponent {
pub fn builder() -> IncorporatesComponentBuilder {
IncorporatesComponentBuilder::new()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ControlImplementation {
pub uuid: uuid::Uuid,
pub source: crate::primitives::UriReference,
pub description: crate::primitives::MarkupMultiline,
#[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 set_parameters: Vec<SetParameter>,
#[serde(default)]
pub implemented_requirements: Vec<ImplementedRequirement>,
}
#[must_use]
#[derive(Debug)]
pub struct ControlImplementationBuilder {
uuid: Option<uuid::Uuid>,
source: Option<crate::primitives::UriReference>,
description: Option<crate::primitives::MarkupMultiline>,
props: Vec<Property>,
links: Vec<Link>,
set_parameters: Vec<SetParameter>,
implemented_requirements: Vec<ImplementedRequirement>,
}
impl ControlImplementationBuilder {
pub fn new() -> Self {
Self {
uuid: None,
source: None,
description: None,
props: Vec::new(),
links: Vec::new(),
set_parameters: Vec::new(),
implemented_requirements: Vec::new(),
}
}
}
impl Default for ControlImplementationBuilder {
fn default() -> Self {
Self::new()
}
}
impl ControlImplementationBuilder {
pub fn uuid(mut self, v: impl Into<uuid::Uuid>) -> Self {
self.uuid = Some(v.into());
self
}
pub fn source(mut self, v: impl Into<crate::primitives::UriReference>) -> Self {
self.source = Some(v.into());
self
}
pub fn description(
mut self,
v: impl Into<crate::primitives::MarkupMultiline>,
) -> Self {
self.description = 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 set_parameters(mut self, v: impl Into<SetParameter>) -> Self {
self.set_parameters.push(v.into());
self
}
pub fn implemented_requirements(
mut self,
v: impl Into<ImplementedRequirement>,
) -> Self {
self.implemented_requirements.push(v.into());
self
}
pub fn build(self) -> ::core::result::Result<ControlImplementation, BuildError> {
let uuid = self
.uuid
.ok_or_else(|| BuildError::MissingField("required field `uuid` not set"))?;
let source = self
.source
.ok_or_else(|| BuildError::MissingField("required field `source` not set"))?;
let description = self
.description
.ok_or_else(|| BuildError::MissingField(
"required field `description` not set",
))?;
Ok(ControlImplementation {
uuid,
source,
description,
props: self.props,
links: self.links,
set_parameters: self.set_parameters,
implemented_requirements: self.implemented_requirements,
})
}
}
impl ControlImplementation {
pub fn builder() -> ControlImplementationBuilder {
ControlImplementationBuilder::new()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct ImplementedRequirement {
pub uuid: uuid::Uuid,
pub control_id: String,
pub description: crate::primitives::MarkupMultiline,
#[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 set_parameters: Vec<SetParameter>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub responsible_roles: Vec<ResponsibleRole>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub statements: Vec<Statement>,
#[serde(skip_serializing_if = "Option::is_none")]
pub remarks: Option<crate::primitives::MarkupMultiline>,
}
#[must_use]
#[derive(Debug)]
pub struct ImplementedRequirementBuilder {
uuid: Option<uuid::Uuid>,
control_id: Option<String>,
description: Option<crate::primitives::MarkupMultiline>,
props: Vec<Property>,
links: Vec<Link>,
set_parameters: Vec<SetParameter>,
responsible_roles: Vec<ResponsibleRole>,
statements: Vec<Statement>,
remarks: Option<crate::primitives::MarkupMultiline>,
}
impl ImplementedRequirementBuilder {
pub fn new() -> Self {
Self {
uuid: None,
control_id: None,
description: None,
props: Vec::new(),
links: Vec::new(),
set_parameters: Vec::new(),
responsible_roles: Vec::new(),
statements: Vec::new(),
remarks: None,
}
}
}
impl Default for ImplementedRequirementBuilder {
fn default() -> Self {
Self::new()
}
}
impl ImplementedRequirementBuilder {
pub fn uuid(mut self, v: impl Into<uuid::Uuid>) -> Self {
self.uuid = Some(v.into());
self
}
pub fn control_id(mut self, v: impl Into<String>) -> Self {
self.control_id = Some(v.into());
self
}
pub fn description(
mut self,
v: impl Into<crate::primitives::MarkupMultiline>,
) -> Self {
self.description = 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 set_parameters(mut self, v: impl Into<SetParameter>) -> Self {
self.set_parameters.push(v.into());
self
}
pub fn responsible_roles(mut self, v: impl Into<ResponsibleRole>) -> Self {
self.responsible_roles.push(v.into());
self
}
pub fn statements(mut self, v: impl Into<Statement>) -> Self {
self.statements.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<ImplementedRequirement, BuildError> {
let uuid = self
.uuid
.ok_or_else(|| BuildError::MissingField("required field `uuid` not set"))?;
let control_id = self
.control_id
.ok_or_else(|| BuildError::MissingField(
"required field `control-id` not set",
))?;
let description = self
.description
.ok_or_else(|| BuildError::MissingField(
"required field `description` not set",
))?;
Ok(ImplementedRequirement {
uuid,
control_id,
description,
props: self.props,
links: self.links,
set_parameters: self.set_parameters,
responsible_roles: self.responsible_roles,
statements: self.statements,
remarks: self.remarks,
})
}
}
impl ImplementedRequirement {
pub fn builder() -> ImplementedRequirementBuilder {
ImplementedRequirementBuilder::new()
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub struct Statement {
pub uuid: uuid::Uuid,
pub description: crate::primitives::MarkupMultiline,
#[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 responsible_roles: Vec<ResponsibleRole>,
#[serde(skip_serializing_if = "Option::is_none")]
pub remarks: Option<crate::primitives::MarkupMultiline>,
}
#[must_use]
#[derive(Debug)]
pub struct StatementBuilder {
uuid: Option<uuid::Uuid>,
description: Option<crate::primitives::MarkupMultiline>,
props: Vec<Property>,
links: Vec<Link>,
responsible_roles: Vec<ResponsibleRole>,
remarks: Option<crate::primitives::MarkupMultiline>,
}
impl StatementBuilder {
pub fn new() -> Self {
Self {
uuid: None,
description: None,
props: Vec::new(),
links: Vec::new(),
responsible_roles: Vec::new(),
remarks: None,
}
}
}
impl Default for StatementBuilder {
fn default() -> Self {
Self::new()
}
}
impl StatementBuilder {
pub fn uuid(mut self, v: impl Into<uuid::Uuid>) -> Self {
self.uuid = Some(v.into());
self
}
pub fn description(
mut self,
v: impl Into<crate::primitives::MarkupMultiline>,
) -> Self {
self.description = 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 responsible_roles(mut self, v: impl Into<ResponsibleRole>) -> Self {
self.responsible_roles.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<Statement, BuildError> {
let uuid = self
.uuid
.ok_or_else(|| BuildError::MissingField("required field `uuid` not set"))?;
let description = self
.description
.ok_or_else(|| BuildError::MissingField(
"required field `description` not set",
))?;
Ok(Statement {
uuid,
description,
props: self.props,
links: self.links,
responsible_roles: self.responsible_roles,
remarks: self.remarks,
})
}
}
impl Statement {
pub fn builder() -> StatementBuilder {
StatementBuilder::new()
}
}