refactor(client): split selection detail formatters

This commit is contained in:
Milind Sharma 2026-02-20 10:11:25 +08:00
parent 6151d89e43
commit ca625bf01e
1 changed files with 208 additions and 170 deletions

View File

@ -1293,6 +1293,75 @@ fn pad_netlist_from_footprint_items(
fn selection_item_detail(item: &prost_types::Any) -> Result<String, KiCadError> {
if item.type_url == envelope::type_url("kiapi.board.types.Track") {
let track = decode_any::<board_types::Track>(item, "kiapi.board.types.Track")?;
return Ok(format_track_selection_detail(track));
}
if item.type_url == envelope::type_url("kiapi.board.types.Arc") {
let arc = decode_any::<board_types::Arc>(item, "kiapi.board.types.Arc")?;
return Ok(format_arc_selection_detail(arc));
}
if item.type_url == envelope::type_url("kiapi.board.types.Via") {
let via = decode_any::<board_types::Via>(item, "kiapi.board.types.Via")?;
return Ok(format_via_selection_detail(via));
}
if item.type_url == envelope::type_url("kiapi.board.types.FootprintInstance") {
let footprint = decode_any::<board_types::FootprintInstance>(
item,
"kiapi.board.types.FootprintInstance",
)?;
return Ok(format_footprint_selection_detail(footprint));
}
if item.type_url == envelope::type_url("kiapi.board.types.Field") {
let field = decode_any::<board_types::Field>(item, "kiapi.board.types.Field")?;
return Ok(format_field_selection_detail(field));
}
if item.type_url == envelope::type_url("kiapi.board.types.BoardText") {
let text = decode_any::<board_types::BoardText>(item, "kiapi.board.types.BoardText")?;
return Ok(format_board_text_selection_detail(text));
}
if item.type_url == envelope::type_url("kiapi.board.types.BoardTextBox") {
let textbox =
decode_any::<board_types::BoardTextBox>(item, "kiapi.board.types.BoardTextBox")?;
return Ok(format_board_textbox_selection_detail(textbox));
}
if item.type_url == envelope::type_url("kiapi.board.types.Pad") {
let pad = decode_any::<board_types::Pad>(item, "kiapi.board.types.Pad")?;
return Ok(format_pad_selection_detail(pad));
}
if item.type_url == envelope::type_url("kiapi.board.types.BoardGraphicShape") {
let shape = decode_any::<board_types::BoardGraphicShape>(
item,
"kiapi.board.types.BoardGraphicShape",
)?;
return Ok(format_board_graphic_shape_selection_detail(shape));
}
if item.type_url == envelope::type_url("kiapi.board.types.Zone") {
let zone = decode_any::<board_types::Zone>(item, "kiapi.board.types.Zone")?;
return Ok(format_zone_selection_detail(zone));
}
if item.type_url == envelope::type_url("kiapi.board.types.Dimension") {
let dimension = decode_any::<board_types::Dimension>(item, "kiapi.board.types.Dimension")?;
return Ok(format_dimension_selection_detail(dimension));
}
if item.type_url == envelope::type_url("kiapi.board.types.Group") {
let group = decode_any::<board_types::Group>(item, "kiapi.board.types.Group")?;
return Ok(format_group_selection_detail(group));
}
Ok(format!("unparsed payload ({} bytes)", item.value.len()))
}
fn format_track_selection_detail(track: board_types::Track) -> String {
let id = track.id.map_or_else(|| "-".to_string(), |id| id.value);
let start = track
.start
@ -1308,14 +1377,10 @@ fn selection_item_detail(item: &prost_types::Any) -> Result<String, KiCadError>
.net
.map(|n| format!("{}:{}", n.code.map_or(0, |c| c.value), n.name))
.unwrap_or_else(|| "-".to_string());
format!("track id={id} start_nm={start} end_nm={end} width_nm={width} layer={layer} net={net}")
}
return Ok(format!(
"track id={id} start_nm={start} end_nm={end} width_nm={width} layer={layer} net={net}"
));
}
if item.type_url == envelope::type_url("kiapi.board.types.Arc") {
let arc = decode_any::<board_types::Arc>(item, "kiapi.board.types.Arc")?;
fn format_arc_selection_detail(arc: board_types::Arc) -> String {
let id = arc.id.map_or_else(|| "-".to_string(), |id| id.value);
let start = arc
.start
@ -1334,13 +1399,12 @@ fn selection_item_detail(item: &prost_types::Any) -> Result<String, KiCadError>
.net
.map(|n| format!("{}:{}", n.code.map_or(0, |c| c.value), n.name))
.unwrap_or_else(|| "-".to_string());
return Ok(format!(
format!(
"arc id={id} start_nm={start} mid_nm={mid} end_nm={end} width_nm={width} layer={layer} net={net}"
));
}
)
}
if item.type_url == envelope::type_url("kiapi.board.types.Via") {
let via = decode_any::<board_types::Via>(item, "kiapi.board.types.Via")?;
fn format_via_selection_detail(via: board_types::Via) -> String {
let id = via.id.map_or_else(|| "-".to_string(), |id| id.value);
let position = via
.position
@ -1352,33 +1416,27 @@ fn selection_item_detail(item: &prost_types::Any) -> Result<String, KiCadError>
let via_type = board_types::ViaType::try_from(via.r#type)
.map(|value| value.as_str_name().to_string())
.unwrap_or_else(|_| format!("UNKNOWN({})", via.r#type));
return Ok(format!(
"via id={id} pos_nm={position} type={via_type} net={net}"
));
}
format!("via id={id} pos_nm={position} type={via_type} net={net}")
}
if item.type_url == envelope::type_url("kiapi.board.types.FootprintInstance") {
let fp = decode_any::<board_types::FootprintInstance>(
item,
"kiapi.board.types.FootprintInstance",
)?;
let id = fp.id.map_or_else(|| "-".to_string(), |id| id.value);
let reference = fp
fn format_footprint_selection_detail(footprint: board_types::FootprintInstance) -> String {
let id = footprint.id.map_or_else(|| "-".to_string(), |id| id.value);
let reference = footprint
.reference_field
.as_ref()
.and_then(|field| field.text.as_ref())
.and_then(|board_text| board_text.text.as_ref())
.map(|text| text.text.clone())
.unwrap_or_else(|| "-".to_string());
let position = fp
let position = footprint
.position
.map_or_else(|| "-".to_string(), |v| format!("{},{}", v.x_nm, v.y_nm));
let orientation_deg = fp.orientation.map_or_else(
let orientation_deg = footprint.orientation.map_or_else(
|| "-".to_string(),
|orientation| orientation.value_degrees.to_string(),
);
let layer = layer_to_model(fp.layer).name;
let pad_count = fp
let layer = layer_to_model(footprint.layer).name;
let pad_count = footprint
.definition
.as_ref()
.map(|definition| {
@ -1389,27 +1447,25 @@ fn selection_item_detail(item: &prost_types::Any) -> Result<String, KiCadError>
.count()
})
.unwrap_or(0);
return Ok(format!(
format!(
"footprint id={id} ref={reference} pos_nm={position} orientation_deg={orientation_deg} layer={layer} pad_count={pad_count}"
));
}
)
}
if item.type_url == envelope::type_url("kiapi.board.types.Field") {
let field = decode_any::<board_types::Field>(item, "kiapi.board.types.Field")?;
fn format_field_selection_detail(field: board_types::Field) -> String {
let text = field
.text
.as_ref()
.and_then(|board_text| board_text.text.as_ref())
.map(|text| text.text.clone())
.unwrap_or_else(|| "-".to_string());
return Ok(format!(
format!(
"field name={} visible={} text={}",
field.name, field.visible, text
));
}
)
}
if item.type_url == envelope::type_url("kiapi.board.types.BoardText") {
let text = decode_any::<board_types::BoardText>(item, "kiapi.board.types.BoardText")?;
fn format_board_text_selection_detail(text: board_types::BoardText) -> String {
let id = text.id.map_or_else(|| "-".to_string(), |id| id.value);
let layer = layer_to_model(text.layer).name;
let body = text
@ -1417,12 +1473,10 @@ fn selection_item_detail(item: &prost_types::Any) -> Result<String, KiCadError>
.as_ref()
.map(|value| value.text.clone())
.unwrap_or_else(|| "-".to_string());
return Ok(format!("text id={id} layer={layer} text={body}"));
}
format!("text id={id} layer={layer} text={body}")
}
if item.type_url == envelope::type_url("kiapi.board.types.BoardTextBox") {
let textbox =
decode_any::<board_types::BoardTextBox>(item, "kiapi.board.types.BoardTextBox")?;
fn format_board_textbox_selection_detail(textbox: board_types::BoardTextBox) -> String {
let id = textbox.id.map_or_else(|| "-".to_string(), |id| id.value);
let layer = layer_to_model(textbox.layer).name;
let body = textbox
@ -1430,11 +1484,10 @@ fn selection_item_detail(item: &prost_types::Any) -> Result<String, KiCadError>
.as_ref()
.map(|value| value.text.clone())
.unwrap_or_else(|| "-".to_string());
return Ok(format!("textbox id={id} layer={layer} text={body}"));
}
format!("textbox id={id} layer={layer} text={body}")
}
if item.type_url == envelope::type_url("kiapi.board.types.Pad") {
let pad = decode_any::<board_types::Pad>(item, "kiapi.board.types.Pad")?;
fn format_pad_selection_detail(pad: board_types::Pad) -> String {
let id = pad.id.map_or_else(|| "-".to_string(), |id| id.value);
let pad_type = board_types::PadType::try_from(pad.r#type)
.map(|value| value.as_str_name().to_string())
@ -1446,17 +1499,13 @@ fn selection_item_detail(item: &prost_types::Any) -> Result<String, KiCadError>
.net
.map(|n| format!("{}:{}", n.code.map_or(0, |c| c.value), n.name))
.unwrap_or_else(|| "-".to_string());
return Ok(format!(
format!(
"pad id={id} number={} type={pad_type} pos_nm={position} net={net}",
pad.number
));
}
)
}
if item.type_url == envelope::type_url("kiapi.board.types.BoardGraphicShape") {
let shape = decode_any::<board_types::BoardGraphicShape>(
item,
"kiapi.board.types.BoardGraphicShape",
)?;
fn format_board_graphic_shape_selection_detail(shape: board_types::BoardGraphicShape) -> String {
let id = shape.id.map_or_else(|| "-".to_string(), |id| id.value);
let layer = layer_to_model(shape.layer).name;
let net = shape
@ -1468,29 +1517,25 @@ fn selection_item_detail(item: &prost_types::Any) -> Result<String, KiCadError>
.as_ref()
.map(|graphic| format!("{:?}", graphic.geometry))
.unwrap_or_else(|| "-".to_string());
return Ok(format!(
"graphic id={id} layer={layer} net={net} geometry={geometry}"
));
}
format!("graphic id={id} layer={layer} net={net} geometry={geometry}")
}
if item.type_url == envelope::type_url("kiapi.board.types.Zone") {
let zone = decode_any::<board_types::Zone>(item, "kiapi.board.types.Zone")?;
fn format_zone_selection_detail(zone: board_types::Zone) -> String {
let id = zone.id.map_or_else(|| "-".to_string(), |id| id.value);
let zone_type = board_types::ZoneType::try_from(zone.r#type)
.map(|value| value.as_str_name().to_string())
.unwrap_or_else(|_| format!("UNKNOWN({})", zone.r#type));
return Ok(format!(
format!(
"zone id={id} name={} type={} layer_count={} filled={} polygon_count={}",
zone.name,
zone_type,
zone.layers.len(),
zone.filled,
zone.filled_polygons.len()
));
}
)
}
if item.type_url == envelope::type_url("kiapi.board.types.Dimension") {
let dimension = decode_any::<board_types::Dimension>(item, "kiapi.board.types.Dimension")?;
fn format_dimension_selection_detail(dimension: board_types::Dimension) -> String {
let id = dimension.id.map_or_else(|| "-".to_string(), |id| id.value);
let layer = layer_to_model(dimension.layer).name;
let text = dimension
@ -1499,23 +1544,16 @@ fn selection_item_detail(item: &prost_types::Any) -> Result<String, KiCadError>
.map(|value| value.text.clone())
.unwrap_or_else(|| "-".to_string());
let style = format!("{:?}", dimension.dimension_style);
return Ok(format!(
"dimension id={id} layer={layer} text={} style={style}",
text
));
}
format!("dimension id={id} layer={layer} text={} style={style}", text)
}
if item.type_url == envelope::type_url("kiapi.board.types.Group") {
let group = decode_any::<board_types::Group>(item, "kiapi.board.types.Group")?;
fn format_group_selection_detail(group: board_types::Group) -> String {
let id = group.id.map_or_else(|| "-".to_string(), |id| id.value);
return Ok(format!(
format!(
"group id={id} name={} item_count={}",
group.name,
group.items.len()
));
}
Ok(format!("unparsed payload ({} bytes)", item.value.len()))
)
}
fn any_to_pretty_debug(item: &prost_types::Any) -> Result<String, KiCadError> {