1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
use crate::chopper::chopper::Source; use crate::error::CliResult; use crate::source::{dc_source::DCSource, source_factory::SourceFactory}; use crate::util::dc_util; use crate::util::preview::Preview; use byteorder::{BigEndian, ReadBytesExt}; use std::io::BufReader; pub struct DCFactory; impl SourceFactory for DCFactory { fn can_create_from_format(&self, format: &String) -> bool { format.ends_with(".dc") } fn can_create_from_previewer(&self, previewer: &Box<dyn Preview>) -> bool { let buf = previewer.get_buf(); let mut reader = BufReader::new(buf.as_ref()); match reader.read_u64::<BigEndian>() { Ok(magic_num) => { if &magic_num != &dc_util::MAGIC_NUM { return false; } } Err(_) => return false, } match reader.read_u16::<BigEndian>() { Ok(version) => { if &version != &dc_util::VERSION { return false; } } Err(_) => return false, }; true } fn create_source(&mut self, previewer: Box<dyn Preview>) -> CliResult<Box<dyn Source>> { let reader = previewer.get_reader(); Ok(Box::new(DCSource::new(reader)?)) } }