|
1 | 1 | use crate::error::{LoftyError, Result}; |
2 | | -use crate::id3::v2::frame::{FrameFlags, FrameRef}; |
| 2 | +use crate::id3::v2::frame::{FrameFlags, FrameRef, FrameValue}; |
3 | 3 | use crate::id3::v2::synch_u32; |
4 | 4 |
|
5 | 5 | use std::io::Write; |
|
14 | 14 | W: Write, |
15 | 15 | { |
16 | 16 | for frame in frames { |
| 17 | + verify_frame(&frame)?; |
17 | 18 | let value = frame.value.as_bytes()?; |
18 | 19 |
|
19 | 20 | write_frame(writer, frame.id, frame.flags, &value)?; |
|
22 | 23 | Ok(()) |
23 | 24 | } |
24 | 25 |
|
| 26 | +fn verify_frame(frame: &FrameRef) -> Result<()> { |
| 27 | + match (frame.id, frame.value.as_ref()) { |
| 28 | + ("APIC", FrameValue::Picture { .. }) |
| 29 | + | ("USLT", FrameValue::UnSyncText(_)) |
| 30 | + | ("COMM", FrameValue::Comment(_)) |
| 31 | + | ("TXXX", FrameValue::UserText(_)) |
| 32 | + | ("WXXX", FrameValue::UserURL(_)) |
| 33 | + | (_, FrameValue::Binary(_)) |
| 34 | + | ("WFED" | "GRP1", FrameValue::Text { .. }) => Ok(()), |
| 35 | + (id, FrameValue::Text { .. }) if id.starts_with('T') => Ok(()), |
| 36 | + (id, FrameValue::URL(_)) if id.starts_with('W') => Ok(()), |
| 37 | + (id, frame_value) => Err(LoftyError::BadFrame( |
| 38 | + id.to_string(), |
| 39 | + match frame_value { |
| 40 | + FrameValue::Comment(_) => "Comment", |
| 41 | + FrameValue::UnSyncText(_) => "UnSyncText", |
| 42 | + FrameValue::Text { .. } => "Text", |
| 43 | + FrameValue::UserText(_) => "UserText", |
| 44 | + FrameValue::URL(_) => "URL", |
| 45 | + FrameValue::UserURL(_) => "UserURL", |
| 46 | + FrameValue::Picture { .. } => "Picture", |
| 47 | + FrameValue::Binary(_) => "Binary", |
| 48 | + }, |
| 49 | + )), |
| 50 | + } |
| 51 | +} |
| 52 | + |
25 | 53 | fn write_frame<W>(writer: &mut W, name: &str, flags: FrameFlags, value: &[u8]) -> Result<()> |
26 | 54 | where |
27 | 55 | W: Write, |
|
0 commit comments