Documentation
use svd_parser as svd;
use svd_parser::svd::registercluster::RegisterCluster;

use log::*;

use serde::Deserialize;
use std::fs::File;
use std::io::Read;

//use crate::info::*;

use serde::Serialize;

/*#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Enumeration {
    name: String,
    value: u32,
}*/

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Field {
    name: String,
    lsb: u32,
    msb: u32,
    enumerations: Option<Vec<crate::info::Enumeration>>,
}

impl From<Field> for crate::info::Field {
    fn from(field: Field) -> Self {
        Self {
            name: field.name,
            lsb: field.lsb,
            msb: field.msb,
            enumerations: match field.enumerations {
                Some(enums) => enums,
                None => vec![],
            },
        }
    }
}

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Register {
    name: String,
    offset: u64,
    #[serde(default)]
    is_word: bool,
    fields: Option<Vec<Field>>,
}

impl From<Register> for crate::info::Register {
    fn from(reg: Register) -> Self {
        Self {
            name: reg.name,
            offset: reg.offset,
            is_raw: reg.is_word,
            fields: if reg.is_word {
                vec![]
            } else {
                reg.fields
                    .unwrap()
                    .iter()
                    .map(|f| f.clone().into())
                    .collect()
            },
        }
    }
}

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Peripheral {
    name: String,
    word_size: usize,
    regs: Vec<Register>,
}

impl From<Peripheral> for crate::info::Peripheral {
    fn from(peripheral: Peripheral) -> Self {
        Self {
            name: peripheral.name,
            word_size: peripheral.word_size,
            regs: peripheral.regs.iter().map(|r| r.clone().into()).collect(),
        }
    }
}

#[derive(Deserialize)]
pub struct Config {}

pub fn parse_yaml(filename: &str, config: &Config) -> Vec<crate::info::Peripheral> {
    //let periph_name = periph;

    let yaml = &mut String::new();
    File::open(filename).unwrap().read_to_string(yaml).unwrap();

    let peripherals: Vec<Peripheral> = serde_yaml::from_str(&yaml).unwrap();

    peripherals.iter().map(|p| p.clone().into()).collect()
}