diff --git a/crates/television-channels/src/channels/remote_control.rs b/crates/television-channels/src/channels/remote_control.rs index 6a3e95f..3347d59 100644 --- a/crates/television-channels/src/channels/remote_control.rs +++ b/crates/television-channels/src/channels/remote_control.rs @@ -73,22 +73,21 @@ impl RemoteControl { } pub fn zap(&self, channel_name: &str) -> Result { - if let Ok(channel) = UnitChannel::try_from(channel_name) { - Ok(channel.into()) - } else { - let maybe_prototype = self - .cable_channels - .as_ref() - .and_then(|channels| channels.get(channel_name)); - match maybe_prototype { - Some(prototype) => Ok(TelevisionChannel::Cable( - cable::Channel::from(prototype.clone()), - )), - None => Err(color_eyre::eyre::eyre!( + match self + .cable_channels + .as_ref() + .and_then(|channels| channels.get(channel_name).cloned()) + { + Some(prototype) => Ok(TelevisionChannel::Cable( + cable::Channel::from(prototype.clone()), + )), + None => match UnitChannel::try_from(channel_name) { + Ok(channel) => Ok(channel.into()), + Err(_) => Err(color_eyre::eyre::eyre!( "No channel or cable channel prototype found for {}", channel_name )), - } + }, } } } @@ -105,10 +104,21 @@ impl Default for RemoteControl { } } -pub fn load_builtin_channels() -> Vec { - CliTvChannel::value_variants() +pub fn load_builtin_channels( + filter_out_cable_names: Option<&[&String]>, +) -> Vec { + let mut value_variants = CliTvChannel::value_variants() .iter() - .flat_map(|v| UnitChannel::try_from(v.to_string().as_str())) + .map(std::string::ToString::to_string) + .collect::>(); + + if let Some(f) = filter_out_cable_names { + value_variants.retain(|v| !f.iter().any(|c| *c == v)); + } + + value_variants + .iter() + .flat_map(|v| UnitChannel::try_from(v.as_str())) .collect() } diff --git a/crates/television/television.rs b/crates/television/television.rs index 55bde9a..890424a 100644 --- a/crates/television/television.rs +++ b/crates/television/television.rs @@ -68,8 +68,11 @@ impl Television { } let previewer = Previewer::new(Some(config.previewers.clone().into())); let keymap = Keymap::from(&config.keybindings); - let builtin_channels = load_builtin_channels(); let cable_channels = load_cable_channels().unwrap_or_default(); + let builtin_channels = load_builtin_channels(Some( + &cable_channels.keys().collect::>(), + )); + let app_metadata = AppMetadata::new( env!("CARGO_PKG_VERSION").to_string(), BuildMetadata::new( @@ -115,8 +118,10 @@ impl Television { } pub fn init_remote_control(&mut self) { - let builtin_channels = load_builtin_channels(); let cable_channels = load_cable_channels().unwrap_or_default(); + let builtin_channels = load_builtin_channels(Some( + &cable_channels.keys().collect::>(), + )); self.remote_control = TelevisionChannel::RemoteControl( RemoteControl::new(builtin_channels, Some(cable_channels)), );