diff --git a/holo-bfd/src/northbound/notification.rs b/holo-bfd/src/northbound/notification.rs index 6bdeb69e..f32808b0 100644 --- a/holo-bfd/src/northbound/notification.rs +++ b/holo-bfd/src/northbound/notification.rs @@ -51,8 +51,8 @@ fn state_change_singlehop( remote_discr = remote.discr.to_string(); args.push((base::remote_discr::PATH, Some(remote_discr.as_str()))); } - args.push((base::new_state::PATH, Some(new_state.as_str()))); - args.push((base::state_change_reason::PATH, Some(diag.as_str()))); + args.push((base::new_state::PATH, Some(new_state.as_ref()))); + args.push((base::state_change_reason::PATH, Some(diag.as_ref()))); if let Some(time) = &sess.statistics.last_state_change_time { last_state_change_time = time.to_rfc3339(); args.push(( @@ -66,7 +66,7 @@ fn state_change_singlehop( args.push((base::source_addr::PATH, Some(src_addr.as_str()))); } args.push((base::session_index::PATH, Some(sess_index.as_str()))); - args.push((base::path_type::PATH, Some(path_type.as_str()))); + args.push((base::path_type::PATH, Some(path_type.as_ref()))); args.push((base::interface::PATH, Some(ifname))); args.push((base::echo_enabled::PATH, Some("false"))); notification::send(nb_tx, base::PATH, &args); @@ -96,8 +96,8 @@ fn state_change_multihop( remote_discr = remote.discr.to_string(); args.push((base::remote_discr::PATH, Some(remote_discr.as_str()))); } - args.push((base::new_state::PATH, Some(new_state.as_str()))); - args.push((base::state_change_reason::PATH, Some(diag.as_str()))); + args.push((base::new_state::PATH, Some(new_state.as_ref()))); + args.push((base::state_change_reason::PATH, Some(diag.as_ref()))); if let Some(time) = &sess.statistics.last_state_change_time { last_state_change_time = time.to_rfc3339(); args.push(( @@ -108,6 +108,6 @@ fn state_change_multihop( args.push((base::dest_addr::PATH, Some(dst.as_str()))); args.push((base::source_addr::PATH, Some(src_addr.as_str()))); args.push((base::session_index::PATH, Some(sess_index.as_str()))); - args.push((base::path_type::PATH, Some(path_type.as_str()))); + args.push((base::path_type::PATH, Some(path_type.as_ref()))); notification::send(nb_tx, base::PATH, &args); } diff --git a/holo-bfd/src/northbound/state.rs b/holo-bfd/src/northbound/state.rs index b2339c73..2ccd3e0b 100644 --- a/holo-bfd/src/northbound/state.rs +++ b/holo-bfd/src/northbound/state.rs @@ -116,7 +116,7 @@ fn load_callbacks() -> Callbacks { .path(bfd::ip_sh::sessions::session::path_type::PATH) .get_element_string(|_master, args| { let sess = args.list_entry.as_session().unwrap(); - Some(sess.key.path_type().to_yang()) + Some(sess.key.path_type().to_yang().into()) }) .path(bfd::ip_sh::sessions::session::ip_encapsulation::PATH) .get_element_bool(|_master, _args| { @@ -153,17 +153,17 @@ fn load_callbacks() -> Callbacks { .path(bfd::ip_sh::sessions::session::session_running::local_state::PATH) .get_element_string(|_master, args| { let sess = args.list_entry.as_session().unwrap(); - Some(sess.state.local_state.to_yang()) + Some(sess.state.local_state.to_yang().into()) }) .path(bfd::ip_sh::sessions::session::session_running::remote_state::PATH) .get_element_string(|_master, args| { let sess = args.list_entry.as_session().unwrap(); - sess.state.remote.as_ref().map(|remote| remote.state.to_yang()) + sess.state.remote.as_ref().map(|remote| remote.state.to_yang().into()) }) .path(bfd::ip_sh::sessions::session::session_running::local_diagnostic::PATH) .get_element_string(|_master, args| { let sess = args.list_entry.as_session().unwrap(); - Some(sess.state.local_diag.to_yang()) + Some(sess.state.local_diag.to_yang().into()) }) .path(bfd::ip_sh::sessions::session::session_running::remote_diagnostic::PATH) .get_element_string(|_master, args| { @@ -171,7 +171,7 @@ fn load_callbacks() -> Callbacks { sess.state.remote.as_ref() .map(|remote| remote.diag) .and_then(DiagnosticCode::from_u8) - .map(|diag| diag.to_yang()) + .map(|diag| diag.to_yang().into()) }) .path(bfd::ip_sh::sessions::session::session_running::remote_authenticated::PATH) .get_element_bool(|_master, _args| { @@ -310,7 +310,7 @@ fn load_callbacks() -> Callbacks { .path(bfd::ip_mh::session_groups::session_group::sessions::path_type::PATH) .get_element_string(|_master, args| { let sess = args.list_entry.as_session().unwrap(); - Some(sess.key.path_type().to_yang()) + Some(sess.key.path_type().to_yang().into()) }) .path(bfd::ip_mh::session_groups::session_group::sessions::ip_encapsulation::PATH) .get_element_bool(|_master, _args| { @@ -347,17 +347,17 @@ fn load_callbacks() -> Callbacks { .path(bfd::ip_mh::session_groups::session_group::sessions::session_running::local_state::PATH) .get_element_string(|_master, args| { let sess = args.list_entry.as_session().unwrap(); - Some(sess.state.local_state.to_yang()) + Some(sess.state.local_state.to_yang().into()) }) .path(bfd::ip_mh::session_groups::session_group::sessions::session_running::remote_state::PATH) .get_element_string(|_master, args| { let sess = args.list_entry.as_session().unwrap(); - sess.state.remote.as_ref().map(|remote| remote.state.to_yang()) + sess.state.remote.as_ref().map(|remote| remote.state.to_yang().into()) }) .path(bfd::ip_mh::session_groups::session_group::sessions::session_running::local_diagnostic::PATH) .get_element_string(|_master, args| { let sess = args.list_entry.as_session().unwrap(); - Some(sess.state.local_diag.to_yang()) + Some(sess.state.local_diag.to_yang().into()) }) .path(bfd::ip_mh::session_groups::session_group::sessions::session_running::remote_diagnostic::PATH) .get_element_string(|_master, args| { @@ -365,7 +365,7 @@ fn load_callbacks() -> Callbacks { sess.state.remote.as_ref() .map(|remote| remote.diag) .and_then(DiagnosticCode::from_u8) - .map(|diag| diag.to_yang()) + .map(|diag| diag.to_yang().into()) }) .path(bfd::ip_mh::session_groups::session_group::sessions::session_running::remote_authenticated::PATH) .get_element_bool(|_master, _args| { diff --git a/holo-bfd/src/northbound/yang.rs b/holo-bfd/src/northbound/yang.rs index 61c0f795..d14953c6 100644 --- a/holo-bfd/src/northbound/yang.rs +++ b/holo-bfd/src/northbound/yang.rs @@ -4,6 +4,8 @@ // SPDX-License-Identifier: MIT // +use std::borrow::Cow; + use holo_yang::ToYang; use crate::packet::DiagnosticCode; @@ -11,24 +13,20 @@ use crate::packet::DiagnosticCode; // ===== ToYang implementations ===== impl ToYang for DiagnosticCode { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - DiagnosticCode::Nothing => "none".to_owned(), - DiagnosticCode::TimeExpired => "control-expiry".to_owned(), - DiagnosticCode::EchoFailed => "echo-failed".to_owned(), - DiagnosticCode::NbrDown => "neighbor-down".to_owned(), - DiagnosticCode::FwdPlaneReset => "forwarding-reset".to_owned(), - DiagnosticCode::PathDown => "path-down".to_owned(), - DiagnosticCode::ConcatPathDown => { - "concatenated-path-down".to_owned() - } - DiagnosticCode::AdminDown => "admin-down".to_owned(), + DiagnosticCode::Nothing => "none".into(), + DiagnosticCode::TimeExpired => "control-expiry".into(), + DiagnosticCode::EchoFailed => "echo-failed".into(), + DiagnosticCode::NbrDown => "neighbor-down".into(), + DiagnosticCode::FwdPlaneReset => "forwarding-reset".into(), + DiagnosticCode::PathDown => "path-down".into(), + DiagnosticCode::ConcatPathDown => "concatenated-path-down".into(), + DiagnosticCode::AdminDown => "admin-down".into(), DiagnosticCode::RevConcatPathDown => { - "reverse-concatenated-path-down".to_owned() - } - DiagnosticCode::MisConnectivity => { - "mis-connectivity-defect".to_owned() + "reverse-concatenated-path-down".into() } + DiagnosticCode::MisConnectivity => "mis-connectivity-defect".into(), } } } diff --git a/holo-ldp/src/northbound/state.rs b/holo-ldp/src/northbound/state.rs index 4e9ccc3d..f137e887 100644 --- a/holo-ldp/src/northbound/state.rs +++ b/holo-ldp/src/northbound/state.rs @@ -65,7 +65,7 @@ fn load_callbacks() -> Callbacks { CallbacksBuilder::default() .path(mpls_ldp::global::address_families::ipv4::label_distribution_control_mode::PATH) .get_element_string(|_instance, _args| { - let mode = LabelDistMode::Independent.to_yang(); + let mode = LabelDistMode::Independent.to_yang().into(); Some(mode) }) .path(mpls_ldp::global::address_families::ipv4::bindings::address::PATH) @@ -126,7 +126,7 @@ fn load_callbacks() -> Callbacks { .path(mpls_ldp::global::address_families::ipv4::bindings::address::advertisement_type::PATH) .get_element_string(|_instance, args| { let binding = args.list_entry.as_addr_binding().unwrap(); - Some(binding.adv_type.to_yang()) + Some(binding.adv_type.to_yang().into()) }) .path(mpls_ldp::global::address_families::ipv4::bindings::address::peer::lsr_id::PATH) .get_element_ipv4(|_instance, args| { @@ -196,7 +196,7 @@ fn load_callbacks() -> Callbacks { .path(mpls_ldp::global::address_families::ipv4::bindings::fec_label::peer::label::PATH) .get_element_string(|_instance, args| { let binding = args.list_entry.as_label_binding().unwrap(); - Some(binding.label.to_yang()) + Some(binding.label.to_yang().into()) }) .path(mpls_ldp::global::address_families::ipv4::bindings::fec_label::peer::used_in_forwarding::PATH) .get_element_bool(|_instance, args| { @@ -440,7 +440,7 @@ fn load_callbacks() -> Callbacks { .get_element_string(|_instance, args| { let nbr = args.list_entry.as_neighbor().unwrap(); if nbr.is_operational() { - Some(LabelAdvMode::DownstreamUnsolicited.to_yang()) + Some(LabelAdvMode::DownstreamUnsolicited.to_yang().into()) } else { None } @@ -448,13 +448,13 @@ fn load_callbacks() -> Callbacks { .path(mpls_ldp::peers::peer::label_advertisement_mode::peer::PATH) .get_element_string(|_instance, args| { let nbr = args.list_entry.as_neighbor().unwrap(); - nbr.rcvd_label_adv_mode.as_ref().map(|mode| mode.to_yang()) + nbr.rcvd_label_adv_mode.as_ref().map(|mode| mode.to_yang().into()) }) .path(mpls_ldp::peers::peer::label_advertisement_mode::negotiated::PATH) .get_element_string(|_instance, args| { let nbr = args.list_entry.as_neighbor().unwrap(); if nbr.is_operational() { - Some(LabelAdvMode::DownstreamUnsolicited.to_yang()) + Some(LabelAdvMode::DownstreamUnsolicited.to_yang().into()) } else { None } @@ -498,7 +498,7 @@ fn load_callbacks() -> Callbacks { .path(mpls_ldp::peers::peer::session_state::PATH) .get_element_string(|_instance, args| { let nbr = args.list_entry.as_neighbor().unwrap(); - Some(nbr.state.to_yang()) + Some(nbr.state.to_yang().into()) }) .path(mpls_ldp::peers::peer::tcp_connection::local_address::PATH) .get_element_ip(|_instance, args| { diff --git a/holo-ldp/src/northbound/yang.rs b/holo-ldp/src/northbound/yang.rs index 269548eb..ce48aa29 100644 --- a/holo-ldp/src/northbound/yang.rs +++ b/holo-ldp/src/northbound/yang.rs @@ -4,6 +4,8 @@ // SPDX-License-Identifier: MIT // +use std::borrow::Cow; + use holo_yang::ToYang; use crate::neighbor::{self, LabelAdvMode, LabelDistMode}; @@ -12,44 +14,42 @@ use crate::northbound::state::AdvertisementType; // ===== ToYang implementations ===== impl ToYang for AdvertisementType { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - AdvertisementType::Advertised => "advertised".to_owned(), - AdvertisementType::Received => "received".to_owned(), + AdvertisementType::Advertised => "advertised".into(), + AdvertisementType::Received => "received".into(), } } } impl ToYang for neighbor::fsm::State { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - neighbor::fsm::State::NonExistent => "non-existent".to_owned(), - neighbor::fsm::State::Initialized => "initialized".to_owned(), - neighbor::fsm::State::OpenRec => "openrec".to_owned(), - neighbor::fsm::State::OpenSent => "opensent".to_owned(), - neighbor::fsm::State::Operational => "operational".to_owned(), + neighbor::fsm::State::NonExistent => "non-existent".into(), + neighbor::fsm::State::Initialized => "initialized".into(), + neighbor::fsm::State::OpenRec => "openrec".into(), + neighbor::fsm::State::OpenSent => "opensent".into(), + neighbor::fsm::State::Operational => "operational".into(), } } } impl ToYang for LabelDistMode { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - LabelDistMode::Independent => "independent".to_owned(), - LabelDistMode::Ordered => "ordered".to_owned(), + LabelDistMode::Independent => "independent".into(), + LabelDistMode::Ordered => "ordered".into(), } } } impl ToYang for LabelAdvMode { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { LabelAdvMode::DownstreamUnsolicited => { - "downstream-unsolicited".to_owned() - } - LabelAdvMode::DownstreamOnDemand => { - "downstream-on-demand".to_owned() + "downstream-unsolicited".into() } + LabelAdvMode::DownstreamOnDemand => "downstream-on-demand".into(), } } } diff --git a/holo-ospf/src/northbound/state.rs b/holo-ospf/src/northbound/state.rs index 99d3a12f..8f97bf09 100644 --- a/holo-ospf/src/northbound/state.rs +++ b/holo-ospf/src/northbound/state.rs @@ -92,7 +92,7 @@ where instance .state .as_ref() - .map(|state| state.spf_delay_state.to_yang()) + .map(|state| state.spf_delay_state.to_yang().into()) }) .path(ospf::spf_control::ietf_spf_delay::remaining_time_to_learn::PATH) .attributes(NodeAttributes::TIME) @@ -187,7 +187,7 @@ where .path(ospf::local_rib::route::route_type::PATH) .get_element_string(|_instance, args| { let (_, route) = args.list_entry.as_route().unwrap(); - Some(route.path_type.to_yang()) + Some(route.path_type.to_yang().into()) }) .path(ospf::local_rib::route::route_tag::PATH) .get_element_u32(|_instance, args| { @@ -300,7 +300,7 @@ where .path(ospf::spf_log::event::spf_type::PATH) .get_element_string(|_instance, args| { let log = args.list_entry.as_spf_log().unwrap(); - Some(log.spf_type.to_yang()) + Some(log.spf_type.to_yang().into()) }) .path(ospf::spf_log::event::schedule_timestamp::PATH) .attributes(NodeAttributes::TIME) @@ -397,7 +397,7 @@ where .path(ospf::lsa_log::event::reason::PATH) .get_element_string(|_instance, args| { let log = args.list_entry.as_lsa_log().unwrap(); - Some(log.reason.to_yang()) + Some(log.reason.to_yang().into()) }) .path(ospf::areas::area::PATH) .get_iterate(|instance, _args| { @@ -514,7 +514,7 @@ where .path(ospf::areas::area::interfaces::interface::state::PATH) .get_element_string(|_instance, args| { let iface = args.list_entry.as_interface().unwrap(); - Some(iface.state.ism_state.to_yang()) + Some(iface.state.ism_state.to_yang().into()) }) .path(ospf::areas::area::interfaces::interface::hello_timer::PATH) .attributes(NodeAttributes::TIME) @@ -782,7 +782,7 @@ where .path(ospf::areas::area::interfaces::interface::neighbors::neighbor::state::PATH) .get_element_string(|_instance, args| { let (_, nbr) = args.list_entry.as_neighbor().unwrap(); - Some(nbr.state.to_yang()) + Some(nbr.state.to_yang().into()) }) .path(ospf::areas::area::interfaces::interface::neighbors::neighbor::dead_timer::PATH) .attributes(NodeAttributes::TIME) @@ -813,7 +813,7 @@ where .path(ospf::areas::area::interfaces::interface::neighbors::neighbor::graceful_restart::restart_reason::PATH) .get_element_string(|_instance, args| { let (_, nbr) = args.list_entry.as_neighbor().unwrap(); - nbr.gr.as_ref().map(|gr| gr.restart_reason.to_yang()) + nbr.gr.as_ref().map(|gr| gr.restart_reason.to_yang().into()) }) .path(ospf::areas::area::interfaces::interface::neighbors::neighbor::graceful_restart::grace_timer::PATH) .attributes(NodeAttributes::TIME) @@ -926,7 +926,7 @@ fn load_callbacks_ospfv2() -> Callbacks> { .get_element_string(|_instance, args| { let lse: &LsaEntry = args.list_entry.as_as_lsa().unwrap(); let lsa = &lse.data; - Some(lsa.hdr.lsa_type.to_yang()) + Some(lsa.hdr.lsa_type.to_yang().into()) }) .path(ospf::database::as_scope_lsa_type::as_scope_lsas::as_scope_lsa::ospfv2::header::adv_router::PATH) .get_element_ipv4(|_instance, args| { @@ -1014,7 +1014,7 @@ fn load_callbacks_ospfv2() -> Callbacks> { let lse: &LsaEntry = args.list_entry.as_as_lsa().unwrap(); let lsa = &lse.data; let lsa_body = lsa.body.as_as_external().unwrap(); - Some(lsa_body.flags.to_yang()) + Some(lsa_body.flags.to_yang().into()) }) .path(ospf::database::as_scope_lsa_type::as_scope_lsas::as_scope_lsa::ospfv2::body::external::topologies::topology::metric::PATH) .get_element_u32(|_instance, args| { @@ -1182,7 +1182,7 @@ fn load_callbacks_ospfv2() -> Callbacks> { }) .get_element_string(|_instance, args| { let algo = args.list_entry.as_sr_algo().unwrap(); - Some(algo.to_yang()) + Some(algo.to_yang().into()) }) .path(ospf::database::as_scope_lsa_type::as_scope_lsas::as_scope_lsa::ospfv2::body::opaque::ri_opaque::sid_range_tlvs::sid_range_tlv::PATH) .get_iterate(|_instance, args| { @@ -1265,7 +1265,7 @@ fn load_callbacks_ospfv2() -> Callbacks> { .path(ospf::database::as_scope_lsa_type::as_scope_lsas::as_scope_lsa::ospfv2::body::opaque::extended_prefix_opaque::extended_prefix_tlv::route_type::PATH) .get_element_string(|_instance, args| { let tlv = args.list_entry.as_ospfv2_ext_prefix_tlv().unwrap(); - Some(tlv.route_type.to_yang()) + Some(tlv.route_type.to_yang().into()) }) .path(ospf::database::as_scope_lsa_type::as_scope_lsas::as_scope_lsa::ospfv2::body::opaque::extended_prefix_opaque::extended_prefix_tlv::flags::extended_prefix_flags::PATH) .get_iterate(|_instance, args| { @@ -1434,7 +1434,7 @@ fn load_callbacks_ospfv2() -> Callbacks> { .get_element_string(|_instance, args| { let lse: &LsaEntry = args.list_entry.as_area_lsa().unwrap(); let lsa = &lse.data; - Some(lsa.hdr.lsa_type.to_yang()) + Some(lsa.hdr.lsa_type.to_yang().into()) }) .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv2::header::adv_router::PATH) .get_element_ipv4(|_instance, args| { @@ -1513,7 +1513,7 @@ fn load_callbacks_ospfv2() -> Callbacks> { .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv2::body::router::links::link::r#type::PATH) .get_element_string(|_instance, args| { let rtr_link = args.list_entry.as_ospfv2_router_lsa_link().unwrap(); - Some(rtr_link.link_type.to_yang()) + Some(rtr_link.link_type.to_yang().into()) }) .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv2::body::router::links::link::topologies::topology::PATH) .get_iterate(|_instance, args| { @@ -1749,7 +1749,7 @@ fn load_callbacks_ospfv2() -> Callbacks> { }) .get_element_string(|_instance, args| { let algo = args.list_entry.as_sr_algo().unwrap(); - Some(algo.to_yang()) + Some(algo.to_yang().into()) }) .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv2::body::opaque::ri_opaque::sid_range_tlvs::sid_range_tlv::PATH) .get_iterate(|_instance, args| { @@ -1832,7 +1832,7 @@ fn load_callbacks_ospfv2() -> Callbacks> { .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv2::body::opaque::extended_prefix_opaque::extended_prefix_tlv::route_type::PATH) .get_element_string(|_instance, args| { let tlv = args.list_entry.as_ospfv2_ext_prefix_tlv().unwrap(); - Some(tlv.route_type.to_yang()) + Some(tlv.route_type.to_yang().into()) }) .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv2::body::opaque::extended_prefix_opaque::extended_prefix_tlv::flags::extended_prefix_flags::PATH) .get_iterate(|_instance, args| { @@ -1903,7 +1903,7 @@ fn load_callbacks_ospfv2() -> Callbacks> { .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv2::body::opaque::extended_prefix_opaque::extended_prefix_tlv::prefix_sid_sub_tlvs::prefix_sid_sub_tlv::algorithm::PATH) .get_element_string(|_instance, args| { let prefix_sid = args.list_entry.as_ospfv2_prefix_sid().unwrap(); - Some(prefix_sid.algo.to_yang()) + Some(prefix_sid.algo.to_yang().into()) }) .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv2::body::opaque::extended_prefix_opaque::extended_prefix_tlv::prefix_sid_sub_tlvs::prefix_sid_sub_tlv::sid::PATH) .get_element_u32(|_instance, args| { @@ -1944,7 +1944,7 @@ fn load_callbacks_ospfv2() -> Callbacks> { if let Some(lsa_body) = lsa.body.as_opaque_area() && let Some(lsa_body) = lsa_body.as_ext_link() && let Some(tlv) = &lsa_body.link { - Some(tlv.link_type.to_yang()) + Some(tlv.link_type.to_yang().into()) } else { None } @@ -2164,7 +2164,7 @@ fn load_callbacks_ospfv2() -> Callbacks> { let lse: &LsaEntry = args.list_entry.as_interface_lsa().unwrap(); let lsa = &lse.data; - Some(lsa.hdr.lsa_type.to_yang()) + Some(lsa.hdr.lsa_type.to_yang().into()) }) .path(ospf::areas::area::interfaces::interface::database::link_scope_lsa_type::link_scope_lsas::link_scope_lsa::ospfv2::header::adv_router::PATH) .get_element_ipv4(|_instance, args| { @@ -2387,7 +2387,7 @@ fn load_callbacks_ospfv2() -> Callbacks> { }) .get_element_string(|_instance, args| { let algo = args.list_entry.as_sr_algo().unwrap(); - Some(algo.to_yang()) + Some(algo.to_yang().into()) }) .path(ospf::areas::area::interfaces::interface::database::link_scope_lsa_type::link_scope_lsas::link_scope_lsa::ospfv2::body::opaque::ri_opaque::sid_range_tlvs::sid_range_tlv::PATH) .get_iterate(|_instance, args| { @@ -2571,7 +2571,7 @@ fn load_callbacks_ospfv2() -> Callbacks> { && let Some(lsa_body) = lsa_body.as_grace() && let Some(gr_reason) = &lsa_body.gr_reason && let Some(gr_reason) = GrReason::from_u8(gr_reason.get()) { - Some(gr_reason.to_yang()) + Some(gr_reason.to_yang().into()) } else { None } @@ -2619,7 +2619,7 @@ fn load_callbacks_ospfv3() -> Callbacks> { .get_element_string(|_instance, args| { let lse: &LsaEntry = args.list_entry.as_as_lsa().unwrap(); let lsa = &lse.data; - Some(lsa.hdr.lsa_type.to_yang()) + Some(lsa.hdr.lsa_type.to_yang().into()) }) .path(ospf::database::as_scope_lsa_type::as_scope_lsas::as_scope_lsa::ospfv3::header::adv_router::PATH) .get_element_ipv4(|_instance, args| { @@ -2697,14 +2697,14 @@ fn load_callbacks_ospfv3() -> Callbacks> { let lsa = &lse.data; lsa.body .as_std_as_external() - .map(|lsa_body| lsa_body.flags.to_yang()) + .map(|lsa_body| lsa_body.flags.to_yang().into()) }) .path(ospf::database::as_scope_lsa_type::as_scope_lsas::as_scope_lsa::ospfv3::body::as_external::referenced_ls_type::PATH) .get_element_string(|_instance, args| { let lse: &LsaEntry = args.list_entry.as_as_lsa().unwrap(); let lsa = &lse.data; lsa.body.as_std_as_external().and_then(|lsa_body| { - lsa_body.ref_lsa_type.map(|lsa_type| lsa_type.to_yang()) + lsa_body.ref_lsa_type.map(|lsa_type| lsa_type.to_yang().into()) }) }) .path(ospf::database::as_scope_lsa_type::as_scope_lsas::as_scope_lsa::ospfv3::body::as_external::unknown_referenced_ls_type::PATH) @@ -2886,7 +2886,7 @@ fn load_callbacks_ospfv3() -> Callbacks> { }) .get_element_string(|_instance, args| { let algo = args.list_entry.as_sr_algo().unwrap(); - Some(algo.to_yang()) + Some(algo.to_yang().into()) }) .path(ospf::database::as_scope_lsa_type::as_scope_lsas::as_scope_lsa::ospfv3::body::router_information::sid_range_tlvs::sid_range_tlv::PATH) .get_iterate(|_instance, args| { @@ -3092,7 +3092,7 @@ fn load_callbacks_ospfv3() -> Callbacks> { .get_element_string(|_instance, args| { let lse: &LsaEntry = args.list_entry.as_area_lsa().unwrap(); let lsa = &lse.data; - Some(lsa.hdr.lsa_type.to_yang()) + Some(lsa.hdr.lsa_type.to_yang().into()) }) .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv3::header::adv_router::PATH) .get_element_ipv4(|_instance, args| { @@ -3185,7 +3185,7 @@ fn load_callbacks_ospfv3() -> Callbacks> { .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv3::body::router::links::link::r#type::PATH) .get_element_string(|_instance, args| { let rtr_link = args.list_entry.as_ospfv3_router_lsa_link().unwrap(); - Some(rtr_link.link_type.to_yang()) + Some(rtr_link.link_type.to_yang().into()) }) .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv3::body::router::links::link::metric::PATH) .get_element_u16(|_instance, args| { @@ -3337,7 +3337,7 @@ fn load_callbacks_ospfv3() -> Callbacks> { let lsa = &lse.data; lsa.body .as_std_intra_area_prefix() - .map(|lsa_body| lsa_body.ref_lsa_type.to_yang()) + .map(|lsa_body| lsa_body.ref_lsa_type.to_yang().into()) }) .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv3::body::intra_area_prefix::unknown_referenced_ls_type::PATH) .get_element_u16(|_instance, args| { @@ -3499,7 +3499,7 @@ fn load_callbacks_ospfv3() -> Callbacks> { }) .get_element_string(|_instance, args| { let algo = args.list_entry.as_sr_algo().unwrap(); - Some(algo.to_yang()) + Some(algo.to_yang().into()) }) .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv3::body::router_information::sid_range_tlvs::sid_range_tlv::PATH) .get_iterate(|_instance, args| { @@ -3634,7 +3634,7 @@ fn load_callbacks_ospfv3() -> Callbacks> { .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv3::body::e_router::e_router_tlvs::link_tlv::r#type::PATH) .get_element_string(|_instance, args| { let rtr_link = args.list_entry.as_ospfv3_router_lsa_link().unwrap(); - Some(rtr_link.link_type.to_yang()) + Some(rtr_link.link_type.to_yang().into()) }) .path(ospf::areas::area::database::area_scope_lsa_type::area_scope_lsas::area_scope_lsa::ospfv3::body::e_router::e_router_tlvs::link_tlv::metric::PATH) .get_element_u16(|_instance, args| { @@ -4182,7 +4182,7 @@ fn load_callbacks_ospfv3() -> Callbacks> { let lse: &LsaEntry = args.list_entry.as_interface_lsa().unwrap(); let lsa = &lse.data; - Some(lsa.hdr.lsa_type.to_yang()) + Some(lsa.hdr.lsa_type.to_yang().into()) }) .path(ospf::areas::area::interfaces::interface::database::link_scope_lsa_type::link_scope_lsas::link_scope_lsa::ospfv3::header::adv_router::PATH) .get_element_ipv4(|_instance, args| { @@ -4727,7 +4727,7 @@ fn load_callbacks_ospfv3() -> Callbacks> { if let Some(lsa_body) = lsa.body.as_grace() && let Some(gr_reason) = &lsa_body.gr_reason && let Some(gr_reason) = GrReason::from_u8(gr_reason.get()) { - Some(gr_reason.to_yang()) + Some(gr_reason.to_yang().into()) } else { None } diff --git a/holo-ospf/src/northbound/yang.rs b/holo-ospf/src/northbound/yang.rs index eb228c6d..48e7ace5 100644 --- a/holo-ospf/src/northbound/yang.rs +++ b/holo-ospf/src/northbound/yang.rs @@ -4,6 +4,7 @@ // SPDX-License-Identifier: MIT // +use std::borrow::Cow; use std::fmt::Write; use holo_yang::{ToYang, ToYangBits, TryFromYang}; @@ -25,112 +26,110 @@ use crate::{ospfv2, ospfv3, spf}; // ===== ToYang implementations ===== impl ToYang for PacketType { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - PacketType::Hello => "hello".to_owned(), - PacketType::DbDesc => "database-description".to_owned(), - PacketType::LsRequest => "link-state-request".to_owned(), - PacketType::LsUpdate => "link-state-update".to_owned(), - PacketType::LsAck => "link-state-ack".to_owned(), + PacketType::Hello => "hello".into(), + PacketType::DbDesc => "database-description".into(), + PacketType::LsRequest => "link-state-request".into(), + PacketType::LsUpdate => "link-state-update".into(), + PacketType::LsAck => "link-state-ack".into(), } } } impl ToYang for ism::State { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - ism::State::Down => "down".to_owned(), - ism::State::Loopback => "loopback".to_owned(), - ism::State::Waiting => "waiting".to_owned(), - ism::State::PointToPoint => "point-to-point".to_owned(), - ism::State::DrOther => "dr-other".to_owned(), - ism::State::Backup => "bdr".to_owned(), - ism::State::Dr => "dr".to_owned(), + ism::State::Down => "down".into(), + ism::State::Loopback => "loopback".into(), + ism::State::Waiting => "waiting".into(), + ism::State::PointToPoint => "point-to-point".into(), + ism::State::DrOther => "dr-other".into(), + ism::State::Backup => "bdr".into(), + ism::State::Dr => "dr".into(), } } } impl ToYang for nsm::State { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - nsm::State::Down => "down".to_owned(), - nsm::State::Attempt => "attempt".to_owned(), - nsm::State::Init => "init".to_owned(), - nsm::State::TwoWay => "2-way".to_owned(), - nsm::State::ExStart => "exstart".to_owned(), - nsm::State::Exchange => "exchange".to_owned(), - nsm::State::Loading => "loading".to_owned(), - nsm::State::Full => "full".to_owned(), + nsm::State::Down => "down".into(), + nsm::State::Attempt => "attempt".into(), + nsm::State::Init => "init".into(), + nsm::State::TwoWay => "2-way".into(), + nsm::State::ExStart => "exstart".into(), + nsm::State::Exchange => "exchange".into(), + nsm::State::Loading => "loading".into(), + nsm::State::Full => "full".into(), } } } impl ToYang for spf::fsm::State { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - spf::fsm::State::Quiet => "quiet".to_owned(), - spf::fsm::State::ShortWait => "short-wait".to_owned(), - spf::fsm::State::LongWait => "long-wait".to_owned(), + spf::fsm::State::Quiet => "quiet".into(), + spf::fsm::State::ShortWait => "short-wait".into(), + spf::fsm::State::LongWait => "long-wait".into(), } } } impl ToYang for LsaLogReason { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - LsaLogReason::Refresh => "lsa-refresh".to_owned(), - LsaLogReason::ContentChange => "lsa-content-change".to_owned(), - LsaLogReason::Purge => "lsa-purge".to_owned(), + LsaLogReason::Refresh => "lsa-refresh".into(), + LsaLogReason::ContentChange => "lsa-content-change".into(), + LsaLogReason::Purge => "lsa-purge".into(), } } } impl ToYang for SpfLogType { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - SpfLogType::Full => "full".to_owned(), - SpfLogType::Intra => "intra".to_owned(), - SpfLogType::Inter => "inter".to_owned(), - SpfLogType::External => "external".to_owned(), + SpfLogType::Full => "full".into(), + SpfLogType::Intra => "intra".into(), + SpfLogType::Inter => "inter".into(), + SpfLogType::External => "external".into(), } } } impl ToYang for InterfaceCfgError { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - InterfaceCfgError::AfBitClear => "option-mismatch".to_owned(), - InterfaceCfgError::AreaIdMismatch(..) => "area-mismatch".to_owned(), + InterfaceCfgError::AfBitClear => "option-mismatch".into(), + InterfaceCfgError::AreaIdMismatch(..) => "area-mismatch".into(), InterfaceCfgError::HelloMaskMismatch(..) => { - "net-mask-mismatch".to_owned() + "net-mask-mismatch".into() } InterfaceCfgError::HelloIntervalMismatch(..) => { - "hello-interval-mismatch".to_owned() + "hello-interval-mismatch".into() } InterfaceCfgError::DeadIntervalMismatch(..) => { - "dead-interval-mismatch".to_owned() + "dead-interval-mismatch".into() } InterfaceCfgError::ExternalRoutingCapabilityMismatch(..) => { - "option-mismatch".to_owned() + "option-mismatch".into() } - InterfaceCfgError::MtuMismatch(..) => "mtu-mismatch".to_owned(), + InterfaceCfgError::MtuMismatch(..) => "mtu-mismatch".into(), InterfaceCfgError::DuplicateRouterId(..) => { - "duplicate-router-id".to_owned() + "duplicate-router-id".into() } } } } impl ToYang for LsaValidationError { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - LsaValidationError::InvalidChecksum => { - "invalid-checksum".to_owned() - } - LsaValidationError::InvalidLsaAge => "invalid-age".to_owned(), - LsaValidationError::InvalidLsaSeqNo => "invalid-seq-num".to_owned(), + LsaValidationError::InvalidChecksum => "invalid-checksum".into(), + LsaValidationError::InvalidLsaAge => "invalid-age".into(), + LsaValidationError::InvalidLsaSeqNo => "invalid-seq-num".into(), LsaValidationError::Ospfv2RouterLsaIdMismatch => { - "ospfv2-router-lsa-id-mismatch".to_owned() + "ospfv2-router-lsa-id-mismatch".into() } } } @@ -211,30 +210,30 @@ impl ToYangBits for AdjSidFlags { } impl ToYang for GrReason { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - GrReason::Unknown => "unknown".to_owned(), - GrReason::SoftwareRestart => "software-restart".to_owned(), - GrReason::SoftwareUpgrade => "software-upgrade".to_owned(), + GrReason::Unknown => "unknown".into(), + GrReason::SoftwareRestart => "software-restart".into(), + GrReason::SoftwareUpgrade => "software-upgrade".into(), GrReason::ControlProcessorSwitchover => { - "control-processor-switchover".to_owned() + "control-processor-switchover".into() } } } } impl ToYang for GrExitReason { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - GrExitReason::Completed => "completed".to_owned(), - GrExitReason::TimedOut => "timed-out".to_owned(), - GrExitReason::TopologyChanged => "topology-changed".to_owned(), + GrExitReason::Completed => "completed".into(), + GrExitReason::TimedOut => "timed-out".into(), + GrExitReason::TopologyChanged => "topology-changed".into(), } } } impl ToYang for ospfv2::packet::lsa::LsaAsExternalFlags { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { use ospfv2::packet::lsa::LsaAsExternalFlags; let mut bits = String::new(); @@ -242,7 +241,7 @@ impl ToYang for ospfv2::packet::lsa::LsaAsExternalFlags { write!(bits, "E").unwrap(); } - bits + bits.into() } } @@ -272,31 +271,27 @@ impl ToYangBits for ospfv2::packet::Options { } impl ToYang for ospfv2::packet::lsa::LsaType { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { use ospfv2::packet::lsa::LsaTypeCode; match self.type_code() { - Some(LsaTypeCode::Router) => "ospfv2-router-lsa".to_owned(), - Some(LsaTypeCode::Network) => "ospfv2-network-lsa".to_owned(), + Some(LsaTypeCode::Router) => "ospfv2-router-lsa".into(), + Some(LsaTypeCode::Network) => "ospfv2-network-lsa".into(), Some(LsaTypeCode::SummaryNetwork) => { - "ospfv2-network-summary-lsa".to_owned() + "ospfv2-network-summary-lsa".into() } Some(LsaTypeCode::SummaryRouter) => { - "ospfv2-asbr-summary-lsa".to_owned() - } - Some(LsaTypeCode::AsExternal) => { - "ospfv2-as-external-lsa".to_owned() + "ospfv2-asbr-summary-lsa".into() } + Some(LsaTypeCode::AsExternal) => "ospfv2-as-external-lsa".into(), Some(LsaTypeCode::OpaqueLink) => { - "ospfv2-link-scope-opaque-lsa".to_owned() + "ospfv2-link-scope-opaque-lsa".into() } Some(LsaTypeCode::OpaqueArea) => { - "ospfv2-area-scope-opaque-lsa".to_owned() - } - Some(LsaTypeCode::OpaqueAs) => { - "ospfv2-as-scope-opaque-lsa".to_owned() + "ospfv2-area-scope-opaque-lsa".into() } - None => "ospfv2-unknown-lsa-type".to_owned(), + Some(LsaTypeCode::OpaqueAs) => "ospfv2-as-scope-opaque-lsa".into(), + None => "ospfv2-unknown-lsa-type".into(), } } } @@ -324,30 +319,28 @@ impl ToYangBits for ospfv2::packet::lsa::LsaRouterFlags { } impl ToYang for ospfv2::packet::lsa::LsaRouterLinkType { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { use ospfv2::packet::lsa::LsaRouterLinkType; match self { - LsaRouterLinkType::PointToPoint => "point-to-point-link".to_owned(), - LsaRouterLinkType::TransitNetwork => { - "transit-network-link".to_owned() - } - LsaRouterLinkType::StubNetwork => "stub-network-link".to_owned(), - LsaRouterLinkType::VirtualLink => "virtual-link".to_owned(), + LsaRouterLinkType::PointToPoint => "point-to-point-link".into(), + LsaRouterLinkType::TransitNetwork => "transit-network-link".into(), + LsaRouterLinkType::StubNetwork => "stub-network-link".into(), + LsaRouterLinkType::VirtualLink => "virtual-link".into(), } } } impl ToYang for ospfv2::packet::lsa_opaque::ExtPrefixRouteType { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { use ospfv2::packet::lsa_opaque::ExtPrefixRouteType; match self { - ExtPrefixRouteType::Unspecified => "unspecified".to_owned(), - ExtPrefixRouteType::IntraArea => "intra-area".to_owned(), - ExtPrefixRouteType::InterArea => "inter-area".to_owned(), - ExtPrefixRouteType::AsExternal => "external".to_owned(), - ExtPrefixRouteType::NssaExternal => "nssa".to_owned(), + ExtPrefixRouteType::Unspecified => "unspecified".into(), + ExtPrefixRouteType::IntraArea => "intra-area".into(), + ExtPrefixRouteType::InterArea => "inter-area".into(), + ExtPrefixRouteType::AsExternal => "external".into(), + ExtPrefixRouteType::NssaExternal => "nssa".into(), } } } @@ -369,56 +362,51 @@ impl ToYangBits for ospfv2::packet::lsa_opaque::LsaExtPrefixFlags { } impl ToYang for ospfv3::packet::lsa::LsaType { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { use ospfv3::packet::lsa::LsaFunctionCode; match self.function_code() { - Some(LsaFunctionCode::Router) => "ospfv3-router-lsa".to_owned(), - Some(LsaFunctionCode::Network) => "ospfv3-network-lsa".to_owned(), + Some(LsaFunctionCode::Router) => "ospfv3-router-lsa".into(), + Some(LsaFunctionCode::Network) => "ospfv3-network-lsa".into(), Some(LsaFunctionCode::InterAreaPrefix) => { - "ospfv3-inter-area-prefix-lsa".to_owned() + "ospfv3-inter-area-prefix-lsa".into() } Some(LsaFunctionCode::InterAreaRouter) => { - "ospfv3-inter-area-router-lsa".to_owned() + "ospfv3-inter-area-router-lsa".into() } Some(LsaFunctionCode::AsExternal) => { - "ospfv3-external-lsa-type".to_owned() + "ospfv3-external-lsa-type".into() } - Some(LsaFunctionCode::Link) => "ospfv3-link-lsa".to_owned(), + Some(LsaFunctionCode::Link) => "ospfv3-link-lsa".into(), Some(LsaFunctionCode::IntraAreaPrefix) => { - "ospfv3-intra-area-prefix-lsa".to_owned() + "ospfv3-intra-area-prefix-lsa".into() } Some(LsaFunctionCode::RouterInfo) => { - "ospfv3-router-information-lsa".to_owned() - } - Some(LsaFunctionCode::Grace) => { - "holo-ospf:ospfv3-grace-lsa".to_owned() + "ospfv3-router-information-lsa".into() } + Some(LsaFunctionCode::Grace) => "holo-ospf:ospfv3-grace-lsa".into(), Some(LsaFunctionCode::ExtRouter) => { - "ietf-ospfv3-extended-lsa:ospfv3-e-router-lsa".to_owned() + "ietf-ospfv3-extended-lsa:ospfv3-e-router-lsa".into() } Some(LsaFunctionCode::ExtNetwork) => { - "ietf-ospfv3-extended-lsa:ospfv3-e-network-lsa".to_owned() + "ietf-ospfv3-extended-lsa:ospfv3-e-network-lsa".into() } Some(LsaFunctionCode::ExtInterAreaPrefix) => { - "ietf-ospfv3-extended-lsa:ospfv3-e-inter-area-prefix-lsa" - .to_owned() + "ietf-ospfv3-extended-lsa:ospfv3-e-inter-area-prefix-lsa".into() } Some(LsaFunctionCode::ExtInterAreaRouter) => { - "ietf-ospfv3-extended-lsa:ospfv3-e-inter-area-router-lsa" - .to_owned() + "ietf-ospfv3-extended-lsa:ospfv3-e-inter-area-router-lsa".into() } Some(LsaFunctionCode::ExtAsExternal) => { - "ietf-ospfv3-extended-lsa:ospfv3-e-external-lsa-type".to_owned() + "ietf-ospfv3-extended-lsa:ospfv3-e-external-lsa-type".into() } Some(LsaFunctionCode::ExtLink) => { - "ietf-ospfv3-extended-lsa:ospfv3-e-link-lsa".to_owned() + "ietf-ospfv3-extended-lsa:ospfv3-e-link-lsa".into() } Some(LsaFunctionCode::ExtIntraAreaPrefix) => { - "ietf-ospfv3-extended-lsa:ospfv3-e-intra-area-prefix-lsa" - .to_owned() + "ietf-ospfv3-extended-lsa:ospfv3-e-intra-area-prefix-lsa".into() } - None => "ospfv3-unknown-lsa-type".to_owned(), + None => "ospfv3-unknown-lsa-type".into(), } } } @@ -446,21 +434,19 @@ impl ToYangBits for ospfv3::packet::lsa::LsaRouterFlags { } impl ToYang for ospfv3::packet::lsa::LsaRouterLinkType { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { use ospfv3::packet::lsa::LsaRouterLinkType; match self { - LsaRouterLinkType::PointToPoint => "point-to-point-link".to_owned(), - LsaRouterLinkType::TransitNetwork => { - "transit-network-link".to_owned() - } - LsaRouterLinkType::VirtualLink => "virtual-link".to_owned(), + LsaRouterLinkType::PointToPoint => "point-to-point-link".into(), + LsaRouterLinkType::TransitNetwork => "transit-network-link".into(), + LsaRouterLinkType::VirtualLink => "virtual-link".into(), } } } impl ToYang for ospfv3::packet::lsa::LsaAsExternalFlags { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { use ospfv3::packet::lsa::LsaAsExternalFlags; let mut bits = String::new(); @@ -474,7 +460,7 @@ impl ToYang for ospfv3::packet::lsa::LsaAsExternalFlags { write!(bits, "T").unwrap(); } - bits + bits.into() } } diff --git a/holo-rip/src/northbound/state.rs b/holo-rip/src/northbound/state.rs index 085245b8..969fdd68 100644 --- a/holo-rip/src/northbound/state.rs +++ b/holo-rip/src/northbound/state.rs @@ -245,7 +245,7 @@ fn load_callbacks_ripv2() -> Callbacks> { .path(rip::ipv4::routes::route::route_type::PATH) .get_element_string(|_instance, args| { let route = args.list_entry.as_ipv4_route().unwrap(); - Some(route.route_type.to_yang()) + Some(route.route_type.to_yang().into()) }) .path(rip::ipv4::routes::route::metric::PATH) .get_element_u8(|_instance, args| { @@ -341,7 +341,7 @@ fn load_callbacks_ripng() -> Callbacks> { .path(rip::ipv6::routes::route::route_type::PATH) .get_element_string(|_instance, args| { let route = args.list_entry.as_ipv6_route().unwrap(); - Some(route.route_type.to_yang()) + Some(route.route_type.to_yang().into()) }) .path(rip::ipv6::routes::route::metric::PATH) .get_element_u8(|_instance, args| { diff --git a/holo-rip/src/northbound/yang.rs b/holo-rip/src/northbound/yang.rs index db409ff3..1400cebc 100644 --- a/holo-rip/src/northbound/yang.rs +++ b/holo-rip/src/northbound/yang.rs @@ -4,6 +4,8 @@ // SPDX-License-Identifier: MIT // +use std::borrow::Cow; + use holo_yang::{ToYang, TryFromYang}; use crate::interface::SplitHorizon; @@ -12,10 +14,10 @@ use crate::route::RouteType; // ===== ToYang implementations ===== impl ToYang for RouteType { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - RouteType::Connected => "connected".to_owned(), - RouteType::Rip => "rip".to_owned(), + RouteType::Connected => "connected".into(), + RouteType::Rip => "rip".into(), } } } diff --git a/holo-routing/src/northbound/state.rs b/holo-routing/src/northbound/state.rs index 40ea8edb..723824f3 100644 --- a/holo-routing/src/northbound/state.rs +++ b/holo-routing/src/northbound/state.rs @@ -189,7 +189,7 @@ fn load_callbacks() -> Callbacks { .get_element_string(|_master, args| { let (dest, _) = args.list_entry.as_route().unwrap(); if let RouteDestination::Label(label) = *dest { - Some(label.to_yang()) + Some(label.to_yang().into()) } else { None } @@ -215,7 +215,7 @@ fn load_callbacks() -> Callbacks { if route.nexthops.len() == 1 { let nexthop = route.nexthops.first().unwrap(); if let Nexthop::Special(nexthop) = nexthop { - return Some(nexthop.to_yang()); + return Some(nexthop.to_yang().into()); } } @@ -264,7 +264,7 @@ fn load_callbacks() -> Callbacks { .path(ribs::rib::routes::route::next_hop::mpls_label_stack::entry::label::PATH) .get_element_string(|_master, args| { let (_, label) = args.list_entry.as_label().unwrap(); - Some(label.to_yang()) + Some(label.to_yang().into()) }) .path(ribs::rib::routes::route::next_hop::next_hop_list::next_hop::PATH) .get_iterate(|_master, args| { @@ -313,7 +313,7 @@ fn load_callbacks() -> Callbacks { .path(ribs::rib::routes::route::next_hop::next_hop_list::next_hop::mpls_label_stack::entry::label::PATH) .get_element_string(|_master, args| { let (_, label) = args.list_entry.as_label().unwrap(); - Some(label.to_yang()) + Some(label.to_yang().into()) }) .path(ribs::rib::routes::route::source_protocol::PATH) .get_element_string(|_master, args| { @@ -321,7 +321,7 @@ fn load_callbacks() -> Callbacks { if dest.is_label() { None } else { - Some(route.protocol.to_yang()) + Some(route.protocol.to_yang().into()) } }) .path(ribs::rib::routes::route::active::PATH) @@ -371,7 +371,7 @@ fn load_callbacks() -> Callbacks { .get_element_string(|_master, args| { let (_, route) = args.list_entry.as_route().unwrap(); if let RouteOpaqueAttrs::Ospf { route_type } = &route.opaque_attrs { - Some(route_type.to_yang()) + Some(route_type.to_yang().into()) } else { None } diff --git a/holo-utils/src/bfd.rs b/holo-utils/src/bfd.rs index d4a58aa5..8f856aad 100644 --- a/holo-utils/src/bfd.rs +++ b/holo-utils/src/bfd.rs @@ -4,6 +4,7 @@ // SPDX-License-Identifier: MIT // +use std::borrow::Cow; use std::net::IpAddr; use derive_new::new; @@ -60,10 +61,10 @@ pub struct ClientCfg { // ===== impl PathType ===== impl ToYang for PathType { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - PathType::IpSingleHop => "ietf-bfd-types:path-ip-sh".to_owned(), - PathType::IpMultihop => "ietf-bfd-types:path-ip-mh".to_owned(), + PathType::IpSingleHop => "ietf-bfd-types:path-ip-sh".into(), + PathType::IpMultihop => "ietf-bfd-types:path-ip-mh".into(), } } } @@ -82,12 +83,12 @@ impl SessionKey { // ===== impl State ===== impl ToYang for State { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - State::AdminDown => "adminDown".to_owned(), - State::Down => "down".to_owned(), - State::Init => "init".to_owned(), - State::Up => "up".to_owned(), + State::AdminDown => "adminDown".into(), + State::Down => "down".into(), + State::Init => "init".into(), + State::Up => "up".into(), } } } diff --git a/holo-utils/src/crypto.rs b/holo-utils/src/crypto.rs index 3ee9f942..74cfcbe3 100644 --- a/holo-utils/src/crypto.rs +++ b/holo-utils/src/crypto.rs @@ -4,6 +4,8 @@ // SPDX-License-Identifier: MIT // +use std::borrow::Cow; + use holo_yang::{ToYang, TryFromYang}; use num_derive::FromPrimitive; use serde::{Deserialize, Serialize}; @@ -50,14 +52,14 @@ impl CryptoAlgo { } impl ToYang for CryptoAlgo { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - CryptoAlgo::Md5 => "ietf-key-chain:md5".to_owned(), - CryptoAlgo::Sha1 => "ietf-key-chain:sha-1".to_owned(), - CryptoAlgo::HmacSha1 => "ietf-key-chain:hmac-sha-1".to_owned(), - CryptoAlgo::HmacSha256 => "ietf-key-chain:hmac-sha-256".to_owned(), - CryptoAlgo::HmacSha384 => "ietf-key-chain:hmac-sha-384".to_owned(), - CryptoAlgo::HmacSha512 => "ietf-key-chain:hmac-sha-512".to_owned(), + CryptoAlgo::Md5 => "ietf-key-chain:md5".into(), + CryptoAlgo::Sha1 => "ietf-key-chain:sha-1".into(), + CryptoAlgo::HmacSha1 => "ietf-key-chain:hmac-sha-1".into(), + CryptoAlgo::HmacSha256 => "ietf-key-chain:hmac-sha-256".into(), + CryptoAlgo::HmacSha384 => "ietf-key-chain:hmac-sha-384".into(), + CryptoAlgo::HmacSha512 => "ietf-key-chain:hmac-sha-512".into(), } } } diff --git a/holo-utils/src/ip.rs b/holo-utils/src/ip.rs index 6eb7e41a..cb70c0d6 100644 --- a/holo-utils/src/ip.rs +++ b/holo-utils/src/ip.rs @@ -4,6 +4,7 @@ // SPDX-License-Identifier: MIT // +use std::borrow::Cow; use std::convert::TryInto; use std::net::{ IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6, @@ -207,10 +208,10 @@ impl std::fmt::Display for AddressFamily { } impl ToYang for AddressFamily { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - AddressFamily::Ipv4 => "ipv4".to_owned(), - AddressFamily::Ipv6 => "ipv6".to_owned(), + AddressFamily::Ipv4 => "ipv4".into(), + AddressFamily::Ipv6 => "ipv6".into(), } } } diff --git a/holo-utils/src/mpls.rs b/holo-utils/src/mpls.rs index 33033ebc..ff9d72e1 100644 --- a/holo-utils/src/mpls.rs +++ b/holo-utils/src/mpls.rs @@ -4,6 +4,7 @@ // SPDX-License-Identifier: MIT // +use std::borrow::Cow; use std::collections::BTreeSet; use derive_new::new; @@ -92,27 +93,25 @@ impl std::fmt::Display for Label { } impl ToYang for Label { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self.0 { Label::IPV4_EXPLICIT_NULL => { - "ietf-routing-types:ipv4-explicit-null-label".to_owned() + "ietf-routing-types:ipv4-explicit-null-label".into() } Label::ROUTER_ALERT => { - "ietf-routing-types:router-alert-label".to_owned() + "ietf-routing-types:router-alert-label".into() } Label::IPV6_EXPLICIT_NULL => { - "ietf-routing-types:ipv6-explicit-null-label".to_owned() + "ietf-routing-types:ipv6-explicit-null-label".into() } Label::IMPLICIT_NULL => { - "ietf-routing-types:implicit-null-label".to_owned() + "ietf-routing-types:implicit-null-label".into() } - Label::ELI => { - "ietf-routing-types:entropy-label-indicator".to_owned() - } - Label::GAL => "ietf-routing-types:gal-label".to_owned(), - Label::OAM_ALERT => "ietf-routing-types:oam-alert-label".to_owned(), - Label::EXTENSION => "ietf-routing-types:extension-label".to_owned(), - _ => format!("{}", self.0), + Label::ELI => "ietf-routing-types:entropy-label-indicator".into(), + Label::GAL => "ietf-routing-types:gal-label".into(), + Label::OAM_ALERT => "ietf-routing-types:oam-alert-label".into(), + Label::EXTENSION => "ietf-routing-types:extension-label".into(), + _ => self.0.to_string().into(), } } } diff --git a/holo-utils/src/protocol.rs b/holo-utils/src/protocol.rs index 37b5f6a6..f25096de 100644 --- a/holo-utils/src/protocol.rs +++ b/holo-utils/src/protocol.rs @@ -4,6 +4,7 @@ // SPDX-License-Identifier: MIT // +use std::borrow::Cow; use std::str::FromStr; use holo_yang::{ToYang, TryFromYang}; @@ -61,16 +62,16 @@ impl FromStr for Protocol { } impl ToYang for Protocol { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - Protocol::BFD => "ietf-bfd-types:bfdv1".to_owned(), - Protocol::DIRECT => "ietf-routing:direct".to_owned(), - Protocol::LDP => "ietf-mpls-ldp:mpls-ldp".to_owned(), - Protocol::OSPFV2 => "ietf-ospf:ospfv2".to_owned(), - Protocol::OSPFV3 => "ietf-ospf:ospfv3".to_owned(), - Protocol::RIPV2 => "ietf-rip:ripv2".to_owned(), - Protocol::RIPNG => "ietf-rip:ripng".to_owned(), - Protocol::STATIC => "ietf-routing:static".to_owned(), + Protocol::BFD => "ietf-bfd-types:bfdv1".into(), + Protocol::DIRECT => "ietf-routing:direct".into(), + Protocol::LDP => "ietf-mpls-ldp:mpls-ldp".into(), + Protocol::OSPFV2 => "ietf-ospf:ospfv2".into(), + Protocol::OSPFV3 => "ietf-ospf:ospfv3".into(), + Protocol::RIPV2 => "ietf-rip:ripv2".into(), + Protocol::RIPNG => "ietf-rip:ripng".into(), + Protocol::STATIC => "ietf-routing:static".into(), } } } diff --git a/holo-utils/src/southbound.rs b/holo-utils/src/southbound.rs index 33c0d4a6..4ddd828e 100644 --- a/holo-utils/src/southbound.rs +++ b/holo-utils/src/southbound.rs @@ -4,6 +4,7 @@ // SPDX-License-Identifier: MIT // +use std::borrow::Cow; use std::collections::BTreeSet; use std::net::IpAddr; @@ -196,11 +197,11 @@ impl Nexthop { // ===== impl NexthopSpecial ===== impl ToYang for NexthopSpecial { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - NexthopSpecial::Blackhole => "blackhole".to_owned(), - NexthopSpecial::Unreachable => "unreachable".to_owned(), - NexthopSpecial::Prohibit => "prohibit".to_owned(), + NexthopSpecial::Blackhole => "blackhole".into(), + NexthopSpecial::Unreachable => "unreachable".into(), + NexthopSpecial::Prohibit => "prohibit".into(), } } } @@ -219,12 +220,12 @@ impl TryFromYang for NexthopSpecial { // ===== impl OspfRouteType ===== impl ToYang for OspfRouteType { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { - OspfRouteType::IntraArea => "intra-area".to_owned(), - OspfRouteType::InterArea => "inter-area".to_owned(), - OspfRouteType::Type1External => "external-1".to_owned(), - OspfRouteType::Type2External => "external-2".to_owned(), + OspfRouteType::IntraArea => "intra-area".into(), + OspfRouteType::InterArea => "inter-area".into(), + OspfRouteType::Type1External => "external-1".into(), + OspfRouteType::Type2External => "external-2".into(), } } } diff --git a/holo-utils/src/sr.rs b/holo-utils/src/sr.rs index 4487ca4e..3b43db36 100644 --- a/holo-utils/src/sr.rs +++ b/holo-utils/src/sr.rs @@ -4,6 +4,7 @@ // SPDX-License-Identifier: MIT // +use std::borrow::Cow; use std::collections::{BTreeSet, HashMap}; use derive_new::new; @@ -75,15 +76,15 @@ pub struct SrCfgPrefixSid { // ===== impl IgpAlgoType ===== impl ToYang for IgpAlgoType { - fn to_yang(&self) -> String { + fn to_yang(&self) -> Cow<'static, str> { match self { IgpAlgoType::Spf => { "ietf-segment-routing-common:prefix-sid-algorithm-shortest-path" - .to_owned() + .into() } IgpAlgoType::StrictSpf => { "ietf-segment-routing-common:prefix-sid-algorithm-strict-spf" - .to_owned() + .into() } } } diff --git a/holo-yang/src/lib.rs b/holo-yang/src/lib.rs index 160013c4..e8ec0509 100644 --- a/holo-yang/src/lib.rs +++ b/holo-yang/src/lib.rs @@ -8,6 +8,7 @@ pub mod serde; +use std::borrow::Cow; use std::collections::HashMap; use std::sync::{Arc, LazyLock as Lazy, OnceLock}; @@ -222,7 +223,7 @@ pub static YANG_FEATURES: Lazy>> = pub trait ToYang { // Return YANG textual representation of the value. - fn to_yang(&self) -> String; + fn to_yang(&self) -> Cow<'static, str>; } pub trait ToYangBits {