minor changes and documentation
This commit is contained in:
		
							parent
							
								
									2e033fbd90
								
							
						
					
					
						commit
						243f1a8963
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -1 +1,2 @@
 | 
			
		||||
/target
 | 
			
		||||
.env
 | 
			
		||||
							
								
								
									
										16
									
								
								.vscode/tasks.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								.vscode/tasks.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
{
 | 
			
		||||
    "version": "2.0.0",
 | 
			
		||||
    "tasks": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "shell",
 | 
			
		||||
            "label": "Package and Upload Documentation",
 | 
			
		||||
            "command": "source ./.env && CRATE_NAME=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].name') && CRATE_VERSION=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version') && cargo doc --no-deps && cd ./target && zip -r doc.zip ./doc && curl -v -H \"Authorization: ${KELLNR_TOKEN}\" https://crates.esteil.dedyn.io/api/v1/docs/$CRATE_NAME/$CRATE_VERSION --upload-file ./doc.zip",
 | 
			
		||||
            "args": [],
 | 
			
		||||
            "problemMatcher": [],
 | 
			
		||||
            "group": {
 | 
			
		||||
                "kind": "build",
 | 
			
		||||
                "isDefault": true
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
@ -17,10 +17,24 @@ where
 | 
			
		||||
    fn new() -> (String, Vec<Holiday>);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Represents country codes for holiday calculations
 | 
			
		||||
///
 | 
			
		||||
/// # Variants
 | 
			
		||||
/// * `DE` - Germany
 | 
			
		||||
/// * `US` - United States
 | 
			
		||||
/// * `FR` - France
 | 
			
		||||
///
 | 
			
		||||
/// # Purpose
 | 
			
		||||
/// Provides a type-safe way to specify countries for holiday-related operations
 | 
			
		||||
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
 | 
			
		||||
pub enum CountryCode {
 | 
			
		||||
    /// Germany
 | 
			
		||||
    DE,
 | 
			
		||||
 | 
			
		||||
    /// The United States
 | 
			
		||||
    US,
 | 
			
		||||
 | 
			
		||||
    /// France
 | 
			
		||||
    FR,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -75,12 +75,6 @@ impl Holiday {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone)]
 | 
			
		||||
pub struct HolidayDate {
 | 
			
		||||
    pub name: String,
 | 
			
		||||
    pub date: Date,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod test {
 | 
			
		||||
    use crate::holiday::Activity;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										76
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										76
									
								
								src/lib.rs
									
									
									
									
									
								
							@ -1,21 +1,28 @@
 | 
			
		||||
use std::collections::HashMap;
 | 
			
		||||
 | 
			
		||||
use time::Date;
 | 
			
		||||
pub use time::Date;
 | 
			
		||||
 | 
			
		||||
use crate::{
 | 
			
		||||
    countries::CountryCode,
 | 
			
		||||
    holiday::{HDate, Holiday, HolidayDate},
 | 
			
		||||
};
 | 
			
		||||
use crate::holiday::{HDate, Holiday};
 | 
			
		||||
 | 
			
		||||
mod countries;
 | 
			
		||||
mod holiday;
 | 
			
		||||
pub(crate) mod utils;
 | 
			
		||||
 | 
			
		||||
pub use countries::CountryCode;
 | 
			
		||||
 | 
			
		||||
/// A struct to manage and check holidays for different countries
 | 
			
		||||
pub struct HolidayChecker {
 | 
			
		||||
    countries: HashMap<CountryCode, (String, Vec<Holiday>)>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl HolidayChecker {
 | 
			
		||||
    /// Creates a new HolidayChecker with holidays for specified countries
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Arguments
 | 
			
		||||
    /// * `countries` - A vector of country codes to initialize holidays for
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Returns
 | 
			
		||||
    /// A new HolidayChecker instance with holidays for the specified countries
 | 
			
		||||
    pub fn new(countries: Vec<CountryCode>) -> Self {
 | 
			
		||||
        let mut map = HashMap::new();
 | 
			
		||||
 | 
			
		||||
@ -27,6 +34,15 @@ impl HolidayChecker {
 | 
			
		||||
        Self { countries: map }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Retrieves a list of holidays for a specific country, state, and year
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Arguments
 | 
			
		||||
    /// * `country` - The country code
 | 
			
		||||
    /// * `state` - The specific state within the country
 | 
			
		||||
    /// * `year` - The year to retrieve holidays for
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Returns
 | 
			
		||||
    /// A vector of HolidayDate for the specified country, state, and year
 | 
			
		||||
    pub fn holiday_list(&self, country: CountryCode, state: &str, year: i32) -> Vec<HolidayDate> {
 | 
			
		||||
        Self::get_years_holidays(
 | 
			
		||||
            self.countries
 | 
			
		||||
@ -37,6 +53,15 @@ impl HolidayChecker {
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Counts the number of holidays for a specific country, state, and year
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Arguments
 | 
			
		||||
    /// * `country` - The country code
 | 
			
		||||
    /// * `state` - The specific state within the country
 | 
			
		||||
    /// * `year` - The year to count holidays for
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Returns
 | 
			
		||||
    /// The number of holidays for the specified country, state, and year
 | 
			
		||||
    pub fn number_of_holidays(&self, country: CountryCode, state: &str, year: i32) -> usize {
 | 
			
		||||
        Self::get_years_holidays(
 | 
			
		||||
            self.countries
 | 
			
		||||
@ -48,6 +73,16 @@ impl HolidayChecker {
 | 
			
		||||
        .len()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Checks if a specific date is a holiday for a given country, state, and year
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Arguments
 | 
			
		||||
    /// * `country` - The country code
 | 
			
		||||
    /// * `state` - The specific state within the country
 | 
			
		||||
    /// * `year` - The year to check
 | 
			
		||||
    /// * `date` - The specific date to check
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Returns
 | 
			
		||||
    /// An Option containing the HolidayDate if the date is a holiday, None otherwise
 | 
			
		||||
    pub fn is_holiday(
 | 
			
		||||
        &self,
 | 
			
		||||
        country: CountryCode,
 | 
			
		||||
@ -70,6 +105,15 @@ impl HolidayChecker {
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Internal method to retrieve holidays for a specific year and state
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Arguments
 | 
			
		||||
    /// * `holidays` - A tuple containing all states identifier and list of holidays
 | 
			
		||||
    /// * `year` - The year to retrieve holidays for
 | 
			
		||||
    /// * `state` - The specific state to filter holidays
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Returns
 | 
			
		||||
    /// A vector of HolidayDate for the specified year and state
 | 
			
		||||
    fn get_years_holidays(
 | 
			
		||||
        holidays: &(String, Vec<Holiday>),
 | 
			
		||||
        year: i32,
 | 
			
		||||
@ -103,3 +147,25 @@ impl HolidayChecker {
 | 
			
		||||
            .collect()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Represents a specific holiday with its name and date
 | 
			
		||||
///
 | 
			
		||||
/// # Fields
 | 
			
		||||
/// * `name` - The name of the holiday (e.g., "Christmas", "Independence Day")
 | 
			
		||||
/// * `date` - The specific date when the holiday occurs
 | 
			
		||||
///
 | 
			
		||||
/// # Examples
 | 
			
		||||
/// ```rust
 | 
			
		||||
/// let christmas = HolidayDate {
 | 
			
		||||
///     name: String::from("Christmas"),
 | 
			
		||||
///     date: Date::from_calendar_date(2023, Month::December, 25).unwrap()
 | 
			
		||||
/// };
 | 
			
		||||
/// ```
 | 
			
		||||
#[derive(Debug, Clone)]
 | 
			
		||||
pub struct HolidayDate {
 | 
			
		||||
    /// The name of the holiday
 | 
			
		||||
    pub name: String,
 | 
			
		||||
 | 
			
		||||
    /// The date when the holiday is celebrated
 | 
			
		||||
    pub date: Date,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user