use crate::{
cli::{
parser::{
CommonArgsOutputForceOverWrite, PgschemaValidateArgs, ShaclValidateArgs, ShexValidateArgs, ValidateArgs,
},
wrappers::ValidationModeCli,
},
commands::{
PgschemaValidateCommand, ShaclValidateCommand, ShexValidateCommand,
base::{Command, CommandContext},
},
};
use anyhow::{Result, anyhow};
pub struct ValidateCommand {
args: ValidateArgs,
}
impl ValidateCommand {
pub fn new(args: ValidateArgs) -> Self {
Self { args }
}
fn to_shex_args(&self) -> Result<ShexValidateArgs> {
Ok(ShexValidateArgs {
data: self.args.data.clone(),
schema: Some(
self.args
.schema
.clone()
.ok_or_else(|| anyhow!("schema is required for ShEx validation"))?,
),
schema_format: self.args.schema_format,
shapemap: self.args.shapemap.clone(),
shapemap_format: Some(self.args.shapemap_format),
node: self.args.node.clone(),
sort_by: self.args.sort_by.into(),
shape: self.args.shape.clone(),
data_format: self.args.data_format,
base_schema: self.args.base_schema.clone(),
base_data: self.args.base_data.clone(),
reader_mode: self.args.reader_mode,
endpoint: self.args.endpoint.clone(),
result_format: self.args.result_format.into(),
map_state: self.args.map_state.clone(),
strict_iris: false,
external_resolvers: Vec::new(),
list_external_resolvers: false,
common: self.args.common.clone(),
})
}
fn to_shacl_args(&self) -> Result<ShaclValidateArgs> {
Ok(ShaclValidateArgs {
data: self.args.data.clone(),
data_format: self.args.data_format,
base_data: self.args.base_data.clone(),
reader_mode: self.args.reader_mode,
shapes: self.args.schema.clone(),
shapes_format: self.args.schema_format.try_into()?,
base_shapes: self.args.base_schema.clone(),
endpoint: self.args.endpoint.clone(),
mode: self.args.shacl_validation_mode,
result_format: self.args.result_format.into(),
sort_by: self.args.sort_by.into(),
common: self.args.common.clone(),
})
}
fn to_pgschema_args(&self) -> Result<PgschemaValidateArgs> {
Ok(PgschemaValidateArgs {
schema: self
.args
.schema
.clone()
.ok_or_else(|| anyhow!("schema is required for PgSchema validation"))?,
data: self.args.data.clone(),
data_format: self.args.data_format,
typemap: self
.args
.shapemap
.clone()
.ok_or_else(|| anyhow!("shapemap is required for PgSchema validation"))?,
result_validation_format: self.args.result_format.try_into()?,
common: CommonArgsOutputForceOverWrite {
output: self.args.common.output.clone(),
force_overwrite: self.args.common.force_overwrite,
},
})
}
}
impl Command for ValidateCommand {
fn name(&self) -> &'static str {
"validate"
}
fn execute(&self, ctx: &mut CommandContext) -> Result<()> {
match self.args.validation_mode {
ValidationModeCli::ShEx => {
let shex_args = self.to_shex_args()?;
let cmd = ShexValidateCommand::new(shex_args);
cmd.execute(ctx)
},
ValidationModeCli::Shacl => {
let shacl_args = self.to_shacl_args()?;
let cmd = ShaclValidateCommand::new(shacl_args);
cmd.execute(ctx)
},
ValidationModeCli::PGSchema => {
let pgschema_args = self.to_pgschema_args()?;
let cmd = PgschemaValidateCommand::new(pgschema_args);
cmd.execute(ctx)
},
}
}
}