92e1202eba824588be58479f2e6.../src/main.rs
2025-04-29 16:36:20 +00:00

82 lines
2.2 KiB
Rust

use chrono::NaiveDate;
use pipeline_application::application::{
Application, Env, InlineInspection, InspectionType, ReportType, ToolTolerances,
};
use serde::{Deserialize, Deserializer, Serialize};
use uuid::Uuid;
#[fathom_function::function]
async fn pipeline_route(input: Input) -> Result<Output, String> {
let reports_details = input.report_details;
let app = Application::new(Env::Dev, input.org_id, input.project_id).unwrap();
for (pipeline_id, file_details) in input.pipeline_id.into_iter().zip(input.file_details) {
app.process_ili_report(
pipeline_id,
file_details.file_id,
ToolTolerances::default(),
&reports_details,
)
.await
.unwrap();
}
Ok(Output {
status: "Success".to_owned(),
})
}
#[derive(Debug, Serialize)]
struct Output {
status: String,
}
#[derive(Debug, Deserialize)]
struct Input {
org_id: Uuid,
project_id: String,
pipeline_id: Vec<Uuid>,
file_details: Vec<FileDetails>,
// TODO: parse the output of the tool tolerances.
#[serde(flatten)]
report_details: InspectionReportDetails,
}
#[derive(Debug, Deserialize)]
struct InspectionReportDetails {
#[serde(deserialize_with = "deserialize_date")]
date: NaiveDate,
vendor_name: String,
report_type: ReportType,
/// The inspection type and technology used.
inspection_type: InspectionType,
}
impl From<&InspectionReportDetails> for InlineInspection {
fn from(value: &InspectionReportDetails) -> Self {
Self {
date: value.date,
vendor_name: value.vendor_name.to_owned(),
report_type: value.report_type,
inspection_type: value.inspection_type,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FileDetails {
pub file_id: Uuid,
pub revision_id: Uuid,
}
const FORMAT: &'static str = "%a %b %d %Y";
pub fn deserialize_date<'de, D>(deserializer: D) -> Result<NaiveDate, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
let dt = NaiveDate::parse_from_str(&s, FORMAT).map_err(serde::de::Error::custom)?;
Ok(dt)
}