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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use super::MinimalId;
use super::Seed;

use data_encoding::BASE64URL_NOPAD;

/// # Generator
///
/// top level structure for interfacing with the library
///
/// ```
/// use minimal_id::Generator;
/// let generator = Generator::default();
/// ```
#[derive(PartialEq, Debug)]
pub struct Generator {}

impl Default for Generator {
	/// Creates the generator
	///
	/// This doesn't really do anything other than contain the functions
	/// This can probably be deleted.
	fn default() -> Self { Generator {} }
}

impl Generator {
	/// Returns a new Minimal Id
	pub fn generate(&self) -> MinimalId {
		let seed = Seed::from_time();
		MinimalId::new(&seed)
	}

	/// Parse a string into a minimal ID
	///
	/// ```
	/// # use minimal_id::*;
	/// # let generator = Generator::default();
	/// let id = generator
	/// 	.id_from_str("AAECAwQFBgcI")
	/// 	.expect("Cannot parse String into ID");
	/// assert_eq!(id.to_slice()[0], 0);
	/// ```
	// TODO(#3): Improve Error Handling
	pub fn id_from_str(&self, id_str: &str) -> Result<MinimalId, ()> {
		let value = BASE64URL_NOPAD.decode(id_str.as_bytes()).map_err(|_| ())?;
		Ok(MinimalId::from_slice(&value))
	}
}

#[cfg(test)]
mod tests {
	use super::*;

	#[test]
	fn functional_test_generate_unique_ids() {
		let generator = Generator::default();
		let id1 = generator.generate();
		let id2 = generator.generate();
		assert_ne!(id1, id2);
	}
}