use crate::iq::signals::{beidou, galileo, glonass, gps, SignalCode};
pub(crate) const SIGNAL_NAMES: &[&str] = &[
"gps-l1ca",
"gps-l5i",
"gps-l5q",
"gps-l2c",
"galileo-e1b",
"galileo-e1c",
"galileo-e5a-i",
"galileo-e5a-q",
"beidou-b1i",
"beidou-b1c",
"glonass-l1of",
];
pub fn build_code(signal: &str, id: i64) -> Result<SignalCode, String> {
let prn = || -> Result<u16, String> {
u16::try_from(id).map_err(|_| format!("{signal}: PRN {id} is out of range"))
};
let code = match signal {
"gps-l1ca" => gps::l1ca(prn()?),
"gps-l5i" => gps::l5_i5(prn()?),
"gps-l5q" => gps::l5_q5(prn()?),
"gps-l2c" => gps::l2c(prn()?),
"galileo-e1b" => galileo::e1b(prn()?),
"galileo-e1c" => galileo::e1c(prn()?),
"galileo-e5a-i" => galileo::e5a_i(prn()?),
"galileo-e5a-q" => galileo::e5a_q(prn()?),
"beidou-b1i" => beidou::b1i(prn()?),
"beidou-b1c" => beidou::b1c_data(prn()?),
"glonass-l1of" => {
let k = i8::try_from(id)
.map_err(|_| format!("GLONASS L1OF frequency channel {id} is outside -7..=6"))?;
glonass::l1of(k)
}
other => {
return Err(format!(
"unknown signal {other:?}; expected one of: {}",
SIGNAL_NAMES.join(", ")
))
}
};
code.map_err(|e| e.to_string())
}