1
0
Fork 0
mirror of https://github.com/sile/hls_m3u8.git synced 2024-06-01 07:08:07 +00:00
hls_m3u8/src/types/initialization_vector.rs

59 lines
1.4 KiB
Rust
Raw Normal View History

2019-09-06 11:20:40 +00:00
use std::fmt;
use std::ops::Deref;
use std::str::{self, FromStr};
2019-09-13 14:06:52 +00:00
use crate::Error;
2019-09-06 11:20:40 +00:00
/// Initialization vector.
///
/// See: [4.3.2.4. EXT-X-KEY]
///
/// [4.3.2.4. EXT-X-KEY]: https://tools.ietf.org/html/rfc8216#section-4.3.2.4
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct InitializationVector(pub [u8; 16]);
impl Deref for InitializationVector {
type Target = [u8];
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl AsRef<[u8]> for InitializationVector {
fn as_ref(&self) -> &[u8] {
&self.0
}
}
impl fmt::Display for InitializationVector {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "0x")?;
for b in &self.0 {
write!(f, "{:02x}", b)?;
}
Ok(())
}
}
impl FromStr for InitializationVector {
type Err = Error;
2019-09-13 14:06:52 +00:00
fn from_str(s: &str) -> Result<Self, Self::Err> {
if !(s.starts_with("0x") || s.starts_with("0X")) {
return Err(Error::invalid_input());
}
if s.len() - 2 != 32 {
return Err(Error::invalid_input());
}
2019-09-06 11:20:40 +00:00
let mut v = [0; 16];
for (i, c) in s.as_bytes().chunks(2).skip(1).enumerate() {
2019-09-13 14:06:52 +00:00
let d = str::from_utf8(c).map_err(|e| Error::custom(e))?;
let b = u8::from_str_radix(d, 16).map_err(|e| Error::custom(e))?;
2019-09-06 11:20:40 +00:00
v[i] = b;
}
2019-09-13 14:06:52 +00:00
2019-09-06 11:20:40 +00:00
Ok(InitializationVector(v))
}
}