(&self, args: &[Value], _context: &Context)
| 29 | } |
| 30 | |
| 31 | fn invoke(&self, args: &[Value], _context: &Context) -> Result<Value, DscError> { |
| 32 | debug!("{}", t!("functions.dataUriToString.invoked")); |
| 33 | |
| 34 | let data_uri = args[0].as_str().unwrap(); |
| 35 | |
| 36 | if !data_uri.starts_with("data:") { |
| 37 | return Err(DscError::FunctionArg( |
| 38 | "dataUriToString".to_string(), |
| 39 | t!("functions.dataUriToString.invalidDataUri").to_string(), |
| 40 | )); |
| 41 | } |
| 42 | |
| 43 | // Find the base64 marker and extract the encoded content |
| 44 | // Format: data:[<mediatype>][;base64],<data> |
| 45 | let Some(comma_pos) = data_uri.find(',') else { |
| 46 | return Err(DscError::FunctionArg( |
| 47 | "dataUriToString".to_string(), |
| 48 | t!("functions.dataUriToString.invalidDataUri").to_string(), |
| 49 | )); |
| 50 | }; |
| 51 | |
| 52 | let metadata = &data_uri[5..comma_pos]; // Skip "data:" |
| 53 | let encoded_data = &data_uri[comma_pos + 1..]; |
| 54 | let parts: Vec<&str> = metadata.split(';').collect(); |
| 55 | |
| 56 | let mediatype = parts[0]; |
| 57 | if mediatype.contains('=') || mediatype.starts_with(':') { |
| 58 | return Err(DscError::FunctionArg( |
| 59 | "dataUriToString".to_string(), |
| 60 | t!("functions.dataUriToString.invalidDataUri").to_string(), |
| 61 | )); |
| 62 | } |
| 63 | |
| 64 | if parts.len() > 1 && parts[1..].iter().any(|p| p.is_empty()) { |
| 65 | return Err(DscError::FunctionArg( |
| 66 | "dataUriToString".to_string(), |
| 67 | t!("functions.dataUriToString.invalidDataUri").to_string(), |
| 68 | )); |
| 69 | } |
| 70 | |
| 71 | // Validate remaining parts: must be either "base64" or "charset=value" |
| 72 | let mut has_base64 = false; |
| 73 | let mut charset = None; |
| 74 | |
| 75 | for part in &parts[1..] { |
| 76 | if *part == "base64" { |
| 77 | has_base64 = true; |
| 78 | } else if let Some(charset_from_part) = part.strip_prefix("charset=") { |
| 79 | if charset.is_some() { |
| 80 | return Err(DscError::FunctionArg( |
| 81 | "dataUriToString".to_string(), |
| 82 | t!("functions.dataUriToString.invalidDataUri").to_string(), |
| 83 | )); |
| 84 | } |
| 85 | charset = Some(charset_from_part); |
| 86 | } else { |
| 87 | return Err(DscError::FunctionArg( |
| 88 | "dataUriToString".to_string(), |
nothing calls this directly
no test coverage detected