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)?))
    }
}