ic_asset_certification/
asset.rs1use std::borrow::Cow;
2
3#[derive(Debug, Clone, PartialEq, Eq)]
32pub struct Asset<'content, 'path> {
33 pub(crate) path: Cow<'path, str>,
34 pub(crate) url: Cow<'path, str>,
35 pub(crate) content: Cow<'content, [u8]>,
36}
37
38impl<'content, 'path> Asset<'content, 'path> {
39 pub fn new(path: impl Into<Cow<'path, str>>, content: impl Into<Cow<'content, [u8]>>) -> Self {
43 let path = path.into();
44
45 Asset {
46 url: Cow::Owned(path_to_url(path.as_ref())),
47 path,
48 content: content.into(),
49 }
50 }
51}
52
53fn path_to_url(path: &str) -> String {
54 if !path.starts_with('/') {
55 format!("/{path}")
56 } else {
57 path.to_string()
58 }
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64 use rstest::*;
65
66 #[rstest]
67 fn asset_new_owned_values() {
68 let path = String::from("foo");
69 let content = vec![1, 2, 3];
70
71 let asset = Asset::new(path.clone(), content.clone());
72
73 assert_eq!(asset.path, path);
74 assert_eq!(asset.url, "/foo");
75 assert_eq!(asset.content, content);
76 }
77
78 #[rstest]
79 fn asset_new_borrowed_values() {
80 let path = "foo";
81 let content = [1, 2, 3].as_slice();
82
83 let asset = Asset::new(path, content);
84
85 assert_eq!(asset.path, path);
86 assert_eq!(asset.url, "/foo");
87 assert_eq!(asset.content, content);
88 }
89}