geop_ops_harness/
cable.rs1use geop_core_math::{
8 geop_error::{GeopError, GeopResult},
9 scalars::Scalar,
10};
11use geop_core_program::{
12 element::{ElementReference, HasElements, Kind},
13 reader::Reader,
14 target::TargetReference,
15};
16use geop_ops_model::{CutWire, Records};
17
18#[derive(Clone, Debug, PartialEq)]
20pub struct Cable {
21 pub length: Scalar,
23 pub diameter: f64,
25 pub min_bend_radius: f64,
27 pub tightest_bend: Option<Scalar>,
29 pub wires: Vec<CutWire>,
30}
31
32pub type Cables = Records<Cable>;
35
36pub fn cables() -> TargetReference<Cables> {
38 TargetReference::new("cables")
39}
40
41impl Kind for Cable {
44 const NAME: &'static str = "cable";
45}
46
47impl HasElements<Cable> for Cables {
48 type Element<'a> = &'a Cable;
49 const SINGLETON: Option<&'static str> = Some("cables");
50
51 fn element(&self, name: &str) -> GeopResult<&Cable> {
52 self.get(name)
53 .ok_or_else(|| GeopError::new(format!("the part has no cable named {name:?}")))
54 }
55}
56
57pub fn cable<'a>(reader: &Reader<'a>, name: &str) -> Option<&'a Cable> {
60 reader.defines(&cables()).then_some(())?;
61 reader
62 .retrieve_element(&ElementReference::new(cables(), name))
63 .ok()
64}