use crate::id;
use crate::release::{HIERARCHY, LINKS, PARTS, Release, ReleaseError, Table, csv_at, field};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Part {
pub code: String,
pub type_name: String,
pub name: String,
pub display_name: String,
pub status: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Edge {
pub code: String,
pub parent: Option<String>,
pub text: String,
}
pub fn read_parts(release: &Release) -> Result<Vec<Part>, ReleaseError> {
let mut table = Table::open(release.file(PARTS)?)?;
let code_at = table.column("PartNumber")?;
let type_at = table.column("PartTypeName")?;
let name_at = table.column("PartName")?;
let display_at = table.column("PartDisplayName")?;
let status_at = table.column("Status")?;
let mut rows = Vec::new();
let path = table.path.clone();
for record in table.reader.records() {
let record = record.map_err(|e| csv_at(&path, e))?;
let code = field(&record, code_at).to_owned();
if !id::is_valid(&code) {
return Err(ReleaseError::Code {
path: table.path.clone(),
code,
});
}
rows.push(Part {
code,
type_name: field(&record, type_at).to_owned(),
name: field(&record, name_at).to_owned(),
display_name: field(&record, display_at).to_owned(),
status: field(&record, status_at).to_owned(),
});
}
Ok(rows)
}
pub fn read_hierarchy(release: &Release) -> Result<Vec<Edge>, ReleaseError> {
let mut table = Table::open(release.file(HIERARCHY)?)?;
let code_at = table.column("CODE")?;
let parent_at = table.column("IMMEDIATE_PARENT")?;
let text_at = table.column("CODE_TEXT")?;
let mut rows = Vec::new();
let path = table.path.clone();
for record in table.reader.records() {
let record = record.map_err(|e| csv_at(&path, e))?;
let parent = field(&record, parent_at);
rows.push(Edge {
code: field(&record, code_at).to_owned(),
parent: (!parent.is_empty()).then(|| parent.to_owned()),
text: field(&record, text_at).to_owned(),
});
}
Ok(rows)
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Link {
pub code: String,
pub part: String,
pub part_name: String,
pub axis: String,
}
pub fn read_links(release: &Release) -> Result<Vec<Link>, ReleaseError> {
let Some(path) = release.optional(LINKS) else {
return Ok(Vec::new());
};
let mut table = Table::open(path)?;
let code_at = table.column("LoincNumber")?;
let part_at = table.column("PartNumber")?;
let name_at = table.column("PartName")?;
let axis_at = table.column("PartTypeName")?;
let mut rows = Vec::new();
let path = table.path.clone();
for record in table.reader.records() {
let record = record.map_err(|e| csv_at(&path, e))?;
rows.push(Link {
code: field(&record, code_at).to_owned(),
part: field(&record, part_at).to_owned(),
part_name: field(&record, name_at).to_owned(),
axis: field(&record, axis_at).to_owned(),
});
}
Ok(rows)
}