2020-04-12 11:35:39 +00:00
|
|
|
use crate::colour::Colour;
|
2020-04-13 12:30:08 +00:00
|
|
|
use crate::{from_base36, to_base36};
|
2020-04-12 11:35:39 +00:00
|
|
|
|
|
|
|
#[derive(Debug, Eq, PartialEq)]
|
|
|
|
pub struct Palette {
|
2020-04-13 12:30:08 +00:00
|
|
|
pub id: u64,
|
2020-04-12 16:13:08 +00:00
|
|
|
pub name: Option<String>,
|
|
|
|
pub colours: Vec<Colour>,
|
2020-04-12 11:35:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl From<String> for Palette {
|
|
|
|
fn from(string: String) -> Palette {
|
|
|
|
let lines: Vec<&str> = string.lines().collect();
|
|
|
|
|
2020-04-13 12:30:08 +00:00
|
|
|
let id = from_base36(&lines[0].replace("PAL ", ""));
|
2020-04-12 11:35:39 +00:00
|
|
|
|
|
|
|
let name = match lines[1].starts_with("NAME") {
|
|
|
|
true => Some(lines[1].replace("NAME ", "").to_string()),
|
|
|
|
false => None,
|
|
|
|
};
|
|
|
|
|
|
|
|
let colour_start_index = if name.is_some() { 2 } else { 1 };
|
|
|
|
|
|
|
|
let colours = lines[colour_start_index..].iter().map(|&line| {
|
|
|
|
Colour::from(line.to_string())
|
|
|
|
}).collect();
|
|
|
|
|
|
|
|
Palette { id, name, colours }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl ToString for Palette {
|
|
|
|
#[inline]
|
|
|
|
fn to_string(&self) -> String {
|
|
|
|
let name = if self.name.as_ref().is_some() {
|
|
|
|
format!("NAME {}\n", self.name.as_ref().unwrap())
|
|
|
|
} else {
|
|
|
|
"".to_string()
|
|
|
|
};
|
|
|
|
|
|
|
|
let mut colours = String::new();
|
|
|
|
for colour in &self.colours {
|
|
|
|
colours.push_str(&format!("{}\n", colour.to_string()));
|
|
|
|
}
|
|
|
|
colours.pop();
|
|
|
|
|
2020-04-13 12:30:08 +00:00
|
|
|
format!("PAL {}\n{}{}", to_base36(self.id), name, colours)
|
2020-04-12 11:35:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_palette_from_string() {
|
|
|
|
let output = Palette::from(
|
|
|
|
"PAL 1\nNAME lamplight\n45,45,59\n66,60,39\n140,94,1".to_string()
|
|
|
|
);
|
|
|
|
|
|
|
|
let expected = Palette {
|
2020-04-13 12:30:08 +00:00
|
|
|
id: 1,
|
2020-04-12 11:35:39 +00:00
|
|
|
name: Some("lamplight".to_string()),
|
|
|
|
colours: vec![
|
|
|
|
Colour {red: 45, green: 45, blue: 59},
|
|
|
|
Colour {red: 66, green: 60, blue: 39},
|
|
|
|
Colour {red: 140, green: 94, blue: 1 },
|
|
|
|
],
|
|
|
|
};
|
|
|
|
|
|
|
|
assert_eq!(output, expected);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_palette_from_string_no_name() {
|
|
|
|
let output = Palette::from(
|
|
|
|
"PAL 9\n45,45,59\n66,60,39\n140,94,1".to_string()
|
|
|
|
);
|
|
|
|
|
|
|
|
let expected = Palette {
|
2020-04-13 12:30:08 +00:00
|
|
|
id: 9,
|
2020-04-12 11:35:39 +00:00
|
|
|
name: None,
|
|
|
|
colours: vec![
|
|
|
|
Colour {red: 45, green: 45, blue: 59},
|
|
|
|
Colour {red: 66, green: 60, blue: 39},
|
|
|
|
Colour {red: 140, green: 94, blue: 1 },
|
|
|
|
],
|
|
|
|
};
|
|
|
|
|
|
|
|
assert_eq!(output, expected);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_palette_to_string() {
|
|
|
|
let output = Palette {
|
2020-04-13 12:30:08 +00:00
|
|
|
id: 16,
|
2020-04-12 11:35:39 +00:00
|
|
|
name: Some("moss".to_string()),
|
|
|
|
colours: vec![
|
|
|
|
Colour {red: 1, green: 2, blue: 3 },
|
|
|
|
Colour {red: 255, green: 254, blue: 253},
|
|
|
|
Colour {red: 126, green: 127, blue: 128},
|
|
|
|
]
|
|
|
|
}.to_string();
|
|
|
|
let expected = "PAL g\nNAME moss\n1,2,3\n255,254,253\n126,127,128".to_string();
|
|
|
|
assert_eq!(output, expected);
|
|
|
|
}
|