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
61
62
63
64
65
66
67
//! A list of keywords to query on Google Trend
//! Keywords is limited to a maximum of 5 keywords.

use crate::errors::{KeywordMaxCapacity, KeywordMinCapacity};
use std::fmt::{Display, Formatter, Result};

#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default)]
pub struct Keywords {
    pub keywords: Vec<&'static str>,
}

impl Keywords {
    /// Create a new set of keywords.
    ///
    /// Keywords vector is limited to a maximum of 5 keyword.
    ///
    /// Returns a Keywords instance.
    ///
    /// # Example
    ///```rust
    /// use rtrend::Keywords;
    /// let keywords = Keywords::new(vec!["Unicorn","Labradoodle","Pikachu"]);
    /// ```
    ///
    /// # Panics
    /// A vector of length greater than 5 will panic.
    /// ```should_panic
    /// # use rtrend::Keywords;
    /// let seven_dwarf = vec!["Bashful","Doc", "Dopey","Grumpy","Happy", "Sleepy", "Sneezy"];
    /// let keywords = Keywords::new(seven_dwarf);
    /// ```
    ///
    /// A vector without keywords will also panic.
    /// ```should_panic
    /// # use rtrend::Keywords;
    /// let keywords = Keywords::new(vec![]);
    /// ```
    pub fn new(keywords: Vec<&'static str>) -> Self {
        Self {
            keywords: check_keywords(keywords),
        }
    }
}

impl From<&'static str> for Keywords {
    fn from(item: &'static str) -> Self {
        Self {
            keywords: check_keywords(item.split(',').collect()),
        }
    }
}

fn check_keywords(keys: Vec<&'static str>) -> Vec<&'static str> {
    if keys.is_empty() {
        Err(KeywordMinCapacity).unwrap()
    }
    if keys.len() > 5 {
        Err(KeywordMaxCapacity).unwrap()
    }
    keys
}

impl Display for Keywords {
    fn fmt(&self, f: &mut Formatter) -> Result {
        write!(f, "{:#?}", self.keywords)
    }
}