From 291b440f8193937e8f6757c7032e0e1137192562 Mon Sep 17 00:00:00 2001 From: Igor Katson Date: Sun, 25 Aug 2024 14:32:11 +0100 Subject: [PATCH] rewrite templates to use compile-time formatting --- crates/upnp-serve/src/http_handlers.rs | 4 +- .../connection_manager/scpd.xml} | 0 .../control/browse/container.tmpl.xml} | 0 .../control/browse/item.tmpl.xml} | 0 .../control/browse/response.tmpl.xml} | 6 +- .../get_system_update_id/response.tmpl.xml} | 0 .../content_directory/scpd.xml} | 0 .../subscriptions/system_update_id.tmpl.xml} | 0 ...t_directory_control_browse_result.tmpl.xml | 5 - crates/upnp-serve/src/templates.rs | 109 +++++++++--------- 10 files changed, 59 insertions(+), 65 deletions(-) rename crates/upnp-serve/src/resources/{scpd_connection_manager.xml => templates/connection_manager/scpd.xml} (100%) rename crates/upnp-serve/src/resources/templates/{content_directory_control_browse_container.tmpl.xml => content_directory/control/browse/container.tmpl.xml} (100%) rename crates/upnp-serve/src/resources/templates/{content_directory_control_browse_item.tmpl.xml => content_directory/control/browse/item.tmpl.xml} (100%) rename crates/upnp-serve/src/resources/templates/{content_directory_control_browse_envelope.tmpl.xml => content_directory/control/browse/response.tmpl.xml} (66%) rename crates/upnp-serve/src/resources/templates/{content_directory_control_get_system_update_id.tmpl.xml => content_directory/control/get_system_update_id/response.tmpl.xml} (100%) rename crates/upnp-serve/src/resources/{scpd_content_directory.xml => templates/content_directory/scpd.xml} (100%) rename crates/upnp-serve/src/resources/templates/{notify_subscription.tmpl.xml => content_directory/subscriptions/system_update_id.tmpl.xml} (100%) delete mode 100644 crates/upnp-serve/src/resources/templates/content_directory_control_browse_result.tmpl.xml diff --git a/crates/upnp-serve/src/http_handlers.rs b/crates/upnp-serve/src/http_handlers.rs index 374e35f..5d0619d 100644 --- a/crates/upnp-serve/src/http_handlers.rs +++ b/crates/upnp-serve/src/http_handlers.rs @@ -195,11 +195,11 @@ pub fn make_router( .route("/description.xml", get(description_xml)) .route( "/scpd/ContentDirectory.xml", - get(|| async { include_str!("resources/scpd_content_directory.xml") }), + get(|| async { include_str!("resources/templates/content_directory/scpd.xml") }), ) .route( "/scpd/ConnectionManager.xml", - get(|| async { include_str!("resources/scpd_connection_manager.xml") }), + get(|| async { include_str!("resources/templates/connection_manager/scpd.xml") }), ) .route( "/control/ContentDirectory", diff --git a/crates/upnp-serve/src/resources/scpd_connection_manager.xml b/crates/upnp-serve/src/resources/templates/connection_manager/scpd.xml similarity index 100% rename from crates/upnp-serve/src/resources/scpd_connection_manager.xml rename to crates/upnp-serve/src/resources/templates/connection_manager/scpd.xml diff --git a/crates/upnp-serve/src/resources/templates/content_directory_control_browse_container.tmpl.xml b/crates/upnp-serve/src/resources/templates/content_directory/control/browse/container.tmpl.xml similarity index 100% rename from crates/upnp-serve/src/resources/templates/content_directory_control_browse_container.tmpl.xml rename to crates/upnp-serve/src/resources/templates/content_directory/control/browse/container.tmpl.xml diff --git a/crates/upnp-serve/src/resources/templates/content_directory_control_browse_item.tmpl.xml b/crates/upnp-serve/src/resources/templates/content_directory/control/browse/item.tmpl.xml similarity index 100% rename from crates/upnp-serve/src/resources/templates/content_directory_control_browse_item.tmpl.xml rename to crates/upnp-serve/src/resources/templates/content_directory/control/browse/item.tmpl.xml diff --git a/crates/upnp-serve/src/resources/templates/content_directory_control_browse_envelope.tmpl.xml b/crates/upnp-serve/src/resources/templates/content_directory/control/browse/response.tmpl.xml similarity index 66% rename from crates/upnp-serve/src/resources/templates/content_directory_control_browse_envelope.tmpl.xml rename to crates/upnp-serve/src/resources/templates/content_directory/control/browse/response.tmpl.xml index a545fdf..09bb4de 100644 --- a/crates/upnp-serve/src/resources/templates/content_directory_control_browse_envelope.tmpl.xml +++ b/crates/upnp-serve/src/resources/templates/content_directory/control/browse/response.tmpl.xml @@ -2,7 +2,11 @@ - + + {items} +]]> {number_returned} {total_matches} {update_id} diff --git a/crates/upnp-serve/src/resources/templates/content_directory_control_get_system_update_id.tmpl.xml b/crates/upnp-serve/src/resources/templates/content_directory/control/get_system_update_id/response.tmpl.xml similarity index 100% rename from crates/upnp-serve/src/resources/templates/content_directory_control_get_system_update_id.tmpl.xml rename to crates/upnp-serve/src/resources/templates/content_directory/control/get_system_update_id/response.tmpl.xml diff --git a/crates/upnp-serve/src/resources/scpd_content_directory.xml b/crates/upnp-serve/src/resources/templates/content_directory/scpd.xml similarity index 100% rename from crates/upnp-serve/src/resources/scpd_content_directory.xml rename to crates/upnp-serve/src/resources/templates/content_directory/scpd.xml diff --git a/crates/upnp-serve/src/resources/templates/notify_subscription.tmpl.xml b/crates/upnp-serve/src/resources/templates/content_directory/subscriptions/system_update_id.tmpl.xml similarity index 100% rename from crates/upnp-serve/src/resources/templates/notify_subscription.tmpl.xml rename to crates/upnp-serve/src/resources/templates/content_directory/subscriptions/system_update_id.tmpl.xml diff --git a/crates/upnp-serve/src/resources/templates/content_directory_control_browse_result.tmpl.xml b/crates/upnp-serve/src/resources/templates/content_directory_control_browse_result.tmpl.xml deleted file mode 100644 index 5323913..0000000 --- a/crates/upnp-serve/src/resources/templates/content_directory_control_browse_result.tmpl.xml +++ /dev/null @@ -1,5 +0,0 @@ - - {items} - diff --git a/crates/upnp-serve/src/templates.rs b/crates/upnp-serve/src/templates.rs index cabbb95..7729f71 100644 --- a/crates/upnp-serve/src/templates.rs +++ b/crates/upnp-serve/src/templates.rs @@ -9,23 +9,19 @@ pub struct RootDescriptionInputs<'a> { } pub fn render_root_description_xml(input: &RootDescriptionInputs<'_>) -> String { - let tmpl = include_str!("resources/templates/root_desc.tmpl.xml").trim(); - - // This isn't great perf-wise but whatever. - tmpl.replace("{friendly_name}", input.friendly_name) - .replace("{manufacturer}", input.manufacturer) - .replace("{model_name}", input.model_name) - .replace("{unique_id}", input.unique_id) - .replace("{http_prefix}", input.http_prefix) + format!( + include_str!("resources/templates/root_desc.tmpl.xml"), + friendly_name = input.friendly_name, + manufacturer = input.manufacturer, + model_name = input.model_name, + unique_id = input.unique_id, + http_prefix = input.http_prefix + ) } pub fn render_content_directory_browse(items: impl IntoIterator) -> String { fn item_or_container(item_or_container: &ItemOrContainer) -> Option { fn item(item: &Item) -> Option { - let tmpl = - include_str!("resources/templates/content_directory_control_browse_item.tmpl.xml") - .trim(); - let mime = item.mime_type.as_ref()?; let upnp_class = match mime.type_().as_str() { "video" => "object.item.videoItem", @@ -33,31 +29,31 @@ pub fn render_content_directory_browse(items: impl IntoIterator String { - let tmpl = include_str!( - "resources/templates/content_directory_control_browse_container.tmpl.xml" + let child_count_tag = match item.children_count { + Some(cc) => format!("childCount=\"{}\"", cc), + None => String::new(), + }; + format!( + include_str!( + "resources/templates/content_directory/control/browse/container.tmpl.xml" + ), + id = item.id, + parent_id = item.parent_id.unwrap_or(0), + title = item.title, + childCountTag = child_count_tag ) - .trim(); - tmpl.replace("{id}", &format!("{}", item.id)) - .replace("{parent_id}", &item.parent_id.unwrap_or(0).to_string()) - .replace("{title}", &item.title) - .replace( - "{childCountTag}", - &match item.children_count { - Some(cc) => format!("childCount=\"{}\"", cc), - None => String::new(), - }, - ) } match item_or_container { @@ -67,27 +63,20 @@ pub fn render_content_directory_browse(items: impl IntoIterator { - result: &'a str, + items: &'a str, number_returned: usize, total_matches: usize, update_id: u64, } - fn render_content_directory_envelope(envelope: &Envelope<'_>) -> String { - let tmpl = - include_str!("resources/templates/content_directory_control_browse_envelope.tmpl.xml") - .trim(); - tmpl.replace("{result}", envelope.result) - .replace("{number_returned}", &envelope.number_returned.to_string()) - .replace("{total_matches}", &envelope.total_matches.to_string()) - .replace("{update_id}", &envelope.update_id.to_string()) - } - - fn render_content_directory_browse_result(items: &str) -> String { - let tmpl = - include_str!("resources/templates/content_directory_control_browse_result.tmpl.xml") - .trim(); - tmpl.replace("{items}", items) + fn render_response(envelope: &Envelope<'_>) -> String { + format!( + include_str!("resources/templates/content_directory/control/browse/response.tmpl.xml"), + items = envelope.items, + number_returned = envelope.number_returned, + total_matches = envelope.total_matches, + update_id = envelope.update_id + ) } let all_items = items @@ -97,16 +86,14 @@ pub fn render_content_directory_browse(items: impl IntoIterator String { - include_str!("resources/templates/notify_subscription.tmpl.xml") - .replace("{system_update_id}", &update_id.to_string()) + format!( + include_str!( + "resources/templates/content_directory/subscriptions/system_update_id.tmpl.xml" + ), + system_update_id = update_id + ) } pub fn render_content_directory_control_get_system_update_id(update_id: u64) -> String { - include_str!("resources/templates/content_directory_control_get_system_update_id.tmpl.xml") - .replace("{id}", &update_id.to_string()) + format!( + include_str!( + "resources/templates/content_directory/control/get_system_update_id/response.tmpl.xml" + ), + id = update_id + ) }