Skip to main content

blockworx/schema/
loc.rs

1//! The compact `loc` string combining a pin's boundary side and slot offset,
2//! e.g. `"w1"` = West + offset 1. `w`/`e` prefix (west/east) + offset digits.
3
4use super::enums::PinSide;
5
6pub fn format_loc(side: PinSide, offset: u32) -> String {
7    let prefix = match side {
8        PinSide::West => 'w',
9        PinSide::East => 'e',
10    };
11    format!("{prefix}{offset}")
12}
13
14pub fn parse_loc(s: &str) -> Result<(PinSide, u32), String> {
15    let mut chars = s.chars();
16    let side = match chars.next() {
17        Some('w') => PinSide::West,
18        Some('e') => PinSide::East,
19        _ => return Err(format!("{s:?} must start with `w` (west) or `e` (east)")),
20    };
21    let rest = chars.as_str();
22    let offset = if rest.is_empty() {
23        0
24    } else {
25        rest.parse()
26            .map_err(|_| format!("{s:?} has a non-numeric offset {rest:?}"))?
27    };
28    Ok((side, offset))
29}