improvement & updated documentation
This commit is contained in:
		
							parent
							
								
									8a78e8f901
								
							
						
					
					
						commit
						a5509152dd
					
				
							
								
								
									
										30
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										30
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -11,17 +11,10 @@ dependencies = [
 | 
			
		||||
 "powerfmt",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "heck"
 | 
			
		||||
version = "0.5.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "holidays"
 | 
			
		||||
version = "0.1.1"
 | 
			
		||||
version = "0.2.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "strum",
 | 
			
		||||
 "time",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
@ -75,27 +68,6 @@ dependencies = [
 | 
			
		||||
 "syn",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "strum"
 | 
			
		||||
version = "0.27.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "strum_macros",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "strum_macros"
 | 
			
		||||
version = "0.27.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "heck",
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "syn"
 | 
			
		||||
version = "2.0.104"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								Cargo.toml
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								Cargo.toml
									
									
									
									
									
								
							@ -1,21 +1,11 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "holidays"
 | 
			
		||||
version = "0.1.1"
 | 
			
		||||
version = "0.2.0"
 | 
			
		||||
edition = "2024"
 | 
			
		||||
publish = ["kellnr"]
 | 
			
		||||
 | 
			
		||||
# [features]
 | 
			
		||||
# default = ["de"]
 | 
			
		||||
# # Includes Germany
 | 
			
		||||
# de = []
 | 
			
		||||
# # Includes France
 | 
			
		||||
# fr = []
 | 
			
		||||
# # Includes The United States
 | 
			
		||||
# us = []
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
time = "0.3.41"
 | 
			
		||||
strum = { version = "0.27.2", features = ["derive"] }
 | 
			
		||||
 | 
			
		||||
[dev-dependencies]
 | 
			
		||||
time = { version = "0.3.41", features = ["macros"] }
 | 
			
		||||
 | 
			
		||||
@ -6,9 +6,14 @@ use crate::{
 | 
			
		||||
    utils::{self},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub(crate) struct GermanHolidays(pub Vec<Holiday<GermanState>>);
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, strum::Display, Clone, Copy, Hash, PartialEq, Eq)]
 | 
			
		||||
/// Enum representing the states in Germany for holiday checking.
 | 
			
		||||
///
 | 
			
		||||
/// This enum is used to specify the specific state within Germany for which holidays are to be checked.
 | 
			
		||||
/// Each variant of the enum corresponds to a different state in Germany.
 | 
			
		||||
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
 | 
			
		||||
pub enum GermanState {
 | 
			
		||||
    /// Baden-Württemberg
 | 
			
		||||
    BW,
 | 
			
		||||
@ -46,11 +51,7 @@ pub enum GermanState {
 | 
			
		||||
    ANY,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl super::StateList for GermanState {
 | 
			
		||||
    fn all_states_identifier() -> String {
 | 
			
		||||
        Self::ANY.to_string()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
impl super::StateList for GermanState {}
 | 
			
		||||
 | 
			
		||||
impl GermanHolidays {
 | 
			
		||||
    pub(crate) fn new() -> Self {
 | 
			
		||||
 | 
			
		||||
@ -6,9 +6,14 @@ use crate::{
 | 
			
		||||
    utils,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub(crate) struct FrenchHolidays(pub Vec<Holiday<FrenchState>>);
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Copy, strum::Display, Hash, PartialEq, Eq)]
 | 
			
		||||
/// Enum representing the states in France for holiday checking.
 | 
			
		||||
///
 | 
			
		||||
/// This enum is used to specify the specific state within France for which holidays are to be checked.
 | 
			
		||||
/// Each variant of the enum corresponds to a different state in France.
 | 
			
		||||
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
 | 
			
		||||
pub enum FrenchState {
 | 
			
		||||
    /// Bas-Rhin
 | 
			
		||||
    BasRhin,
 | 
			
		||||
@ -20,11 +25,7 @@ pub enum FrenchState {
 | 
			
		||||
    ANY,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl super::StateList for FrenchState {
 | 
			
		||||
    fn all_states_identifier() -> String {
 | 
			
		||||
        Self::ANY.to_string()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
impl super::StateList for FrenchState {}
 | 
			
		||||
 | 
			
		||||
impl FrenchHolidays {
 | 
			
		||||
    pub(crate) fn new() -> Self {
 | 
			
		||||
@ -136,10 +137,10 @@ mod tests {
 | 
			
		||||
        let checker = HolidayChecker::new();
 | 
			
		||||
 | 
			
		||||
        let tests = [
 | 
			
		||||
            (FrenchState::BasRhin, 14),
 | 
			
		||||
            (FrenchState::HautRhin, 14),
 | 
			
		||||
            (FrenchState::Moselle, 14),
 | 
			
		||||
            (FrenchState::ANY, 12),
 | 
			
		||||
            (FrenchState::BasRhin, 13),
 | 
			
		||||
            (FrenchState::HautRhin, 13),
 | 
			
		||||
            (FrenchState::Moselle, 13),
 | 
			
		||||
            (FrenchState::ANY, 11),
 | 
			
		||||
        ];
 | 
			
		||||
        for (state, num) in tests {
 | 
			
		||||
            assert_eq!(
 | 
			
		||||
 | 
			
		||||
@ -2,41 +2,39 @@ pub mod de;
 | 
			
		||||
pub mod fr;
 | 
			
		||||
pub mod us;
 | 
			
		||||
 | 
			
		||||
use std::{collections::HashMap, fmt::Display, hash::Hash};
 | 
			
		||||
use std::{collections::HashMap, hash::Hash};
 | 
			
		||||
 | 
			
		||||
use crate::{
 | 
			
		||||
    countries::{
 | 
			
		||||
        de::{GermanHolidays, GermanState},
 | 
			
		||||
        fr::{FrenchHolidays, FrenchState},
 | 
			
		||||
        us::{USHolidays, USState},
 | 
			
		||||
    },
 | 
			
		||||
    holiday::{Activity, Holiday},
 | 
			
		||||
    countries::{de::GermanState, fr::FrenchState, us::USState},
 | 
			
		||||
    holiday::Activity,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// Represents country codes for holiday calculations
 | 
			
		||||
/// Enum representing the country and state for holiday checking.
 | 
			
		||||
///
 | 
			
		||||
/// # Variants
 | 
			
		||||
/// * `DE` - Germany
 | 
			
		||||
/// * `US` - United States
 | 
			
		||||
/// * `FR` - France
 | 
			
		||||
///
 | 
			
		||||
/// # Purpose
 | 
			
		||||
/// Provides a type-safe way to specify countries for holiday-related operations
 | 
			
		||||
/// This enum is used to specify the country and state for which holidays are to be checked.
 | 
			
		||||
/// Each variant of the enum corresponds to a different country and contains a state-specific type.
 | 
			
		||||
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
 | 
			
		||||
 | 
			
		||||
pub enum CountryState {
 | 
			
		||||
    /// Germany
 | 
			
		||||
    ///
 | 
			
		||||
    /// Contains a `GermanState` value representing the specific state within Germany.
 | 
			
		||||
    DE(GermanState),
 | 
			
		||||
 | 
			
		||||
    /// The United States
 | 
			
		||||
    ///
 | 
			
		||||
    /// Contains a `USState` value representing the specific state within the United States.
 | 
			
		||||
    US(USState),
 | 
			
		||||
 | 
			
		||||
    /// France
 | 
			
		||||
    ///
 | 
			
		||||
    /// Contains a `FrenchState` value representing the specific state within France.
 | 
			
		||||
    FR(FrenchState),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub(crate) trait StateList
 | 
			
		||||
where
 | 
			
		||||
    Self: Sized + Display + Hash + Eq + Clone + Copy,
 | 
			
		||||
    Self: Sized + Hash + Eq + Clone + Copy,
 | 
			
		||||
{
 | 
			
		||||
    fn list(states: &[(Self, &[Activity])]) -> HashMap<Self, Vec<Activity>> {
 | 
			
		||||
        let mut map = HashMap::new();
 | 
			
		||||
@ -45,6 +43,4 @@ where
 | 
			
		||||
        }
 | 
			
		||||
        map
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn all_states_identifier() -> String;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
use time::{Date, Month, Weekday};
 | 
			
		||||
use time::{Month, Weekday};
 | 
			
		||||
 | 
			
		||||
use crate::{
 | 
			
		||||
    countries::StateList,
 | 
			
		||||
@ -6,9 +6,14 @@ use crate::{
 | 
			
		||||
    utils,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub(crate) struct USHolidays(pub Vec<Holiday<USState>>);
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Copy, strum::Display, Hash, PartialEq, Eq)]
 | 
			
		||||
/// Enum representing the states in The United States of America for holiday checking.
 | 
			
		||||
///
 | 
			
		||||
/// This enum is used to specify the specific state within he United States of America for which holidays are to be checked.
 | 
			
		||||
/// Each variant of the enum corresponds to a different state in he United States of America.
 | 
			
		||||
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
 | 
			
		||||
pub enum USState {
 | 
			
		||||
    // Northeast
 | 
			
		||||
    Maine,
 | 
			
		||||
@ -76,11 +81,7 @@ pub enum USState {
 | 
			
		||||
    ANY,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl super::StateList for USState {
 | 
			
		||||
    fn all_states_identifier() -> String {
 | 
			
		||||
        Self::ANY.to_string()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
impl super::StateList for USState {}
 | 
			
		||||
 | 
			
		||||
impl USHolidays {
 | 
			
		||||
    pub(crate) fn new() -> Self {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										110
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								src/lib.rs
									
									
									
									
									
								
							@ -1,31 +1,39 @@
 | 
			
		||||
pub use time::Date;
 | 
			
		||||
 | 
			
		||||
use crate::countries::de::{GermanHolidays, GermanState};
 | 
			
		||||
use crate::countries::fr::{FrenchHolidays, FrenchState};
 | 
			
		||||
use crate::countries::us::{USHolidays, USState};
 | 
			
		||||
use crate::holiday::{HDate, Holiday};
 | 
			
		||||
use crate::countries::de::GermanHolidays;
 | 
			
		||||
use crate::countries::fr::FrenchHolidays;
 | 
			
		||||
use crate::countries::us::USHolidays;
 | 
			
		||||
 | 
			
		||||
mod countries;
 | 
			
		||||
mod holiday;
 | 
			
		||||
pub(crate) mod utils;
 | 
			
		||||
 | 
			
		||||
use countries::CountryState;
 | 
			
		||||
pub use countries::{CountryState, de::GermanState, fr::FrenchState, us::USState};
 | 
			
		||||
 | 
			
		||||
/// A struct to manage and check holidays for different countries
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
/// Struct for checking holidays in different countries.
 | 
			
		||||
///
 | 
			
		||||
/// The `HolidayChecker` struct provides methods to check holidays for Germany, the United States, and France.
 | 
			
		||||
pub struct HolidayChecker {
 | 
			
		||||
    de: GermanHolidays,
 | 
			
		||||
    us: USHolidays,
 | 
			
		||||
    fr: FrenchHolidays,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Default for HolidayChecker {
 | 
			
		||||
    fn default() -> Self {
 | 
			
		||||
        Self::new()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl HolidayChecker {
 | 
			
		||||
    /// Creates a new HolidayChecker with holidays for specified countries
 | 
			
		||||
    /// Creates a new `HolidayChecker` instance.
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Arguments
 | 
			
		||||
    /// * `countries` - A vector of country codes to initialize holidays for
 | 
			
		||||
    /// This constructor initializes the holiday checkers for Germany, France, and the United States.
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Returns
 | 
			
		||||
    /// A new HolidayChecker instance with holidays for the specified countries
 | 
			
		||||
    ///
 | 
			
		||||
    /// A new `HolidayChecker` instance.
 | 
			
		||||
    pub fn new() -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            de: GermanHolidays::new(),
 | 
			
		||||
@ -34,42 +42,45 @@ impl HolidayChecker {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Retrieves a list of holidays for a specific country, state, and year
 | 
			
		||||
    /// Returns a list of holidays for the specified country and year.
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Arguments
 | 
			
		||||
    /// * `country` - The country code
 | 
			
		||||
    /// * `state` - The specific state within the country
 | 
			
		||||
    /// * `year` - The year to retrieve holidays for
 | 
			
		||||
    ///
 | 
			
		||||
    /// * `country` - The country and state for which to retrieve the holidays.
 | 
			
		||||
    /// * `year` - The year for which to retrieve the holidays.
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Returns
 | 
			
		||||
    /// A vector of HolidayDate for the specified country, state, and year
 | 
			
		||||
    ///
 | 
			
		||||
    /// A vector of `HolidayDate` objects representing the holidays for the specified country and year.
 | 
			
		||||
    pub fn holiday_list(&self, country: CountryState, year: i32) -> Vec<HolidayDate> {
 | 
			
		||||
        self.get_years_holidays(country, year)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Counts the number of holidays for a specific country, state, and year
 | 
			
		||||
    /// Returns the number of holidays for the specified country and year.
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Arguments
 | 
			
		||||
    /// * `country` - The country code
 | 
			
		||||
    /// * `state` - The specific state within the country
 | 
			
		||||
    /// * `year` - The year to count holidays for
 | 
			
		||||
    ///
 | 
			
		||||
    /// * `country` - The country and state for which to count the holidays.
 | 
			
		||||
    /// * `year` - The year for which to count the holidays.
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Returns
 | 
			
		||||
    /// The number of holidays for the specified country, state, and year
 | 
			
		||||
    ///
 | 
			
		||||
    /// The number of holidays for the specified country and year.
 | 
			
		||||
    pub fn number_of_holidays(&self, country: CountryState, year: i32) -> usize {
 | 
			
		||||
        self.get_years_holidays(country, year).len()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Checks if a specific date is a holiday for a given country, state, and year
 | 
			
		||||
    /// Checks if a given date is a holiday for the specified country 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
 | 
			
		||||
    ///
 | 
			
		||||
    /// * `country` - The country and state for which to check the holiday.
 | 
			
		||||
    /// * `year` - The year for which to check the holiday.
 | 
			
		||||
    /// * `date` - The date to check.
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Returns
 | 
			
		||||
    /// An Option containing the HolidayDate if the date is a holiday, None otherwise
 | 
			
		||||
    ///
 | 
			
		||||
    /// An `Option` containing a `HolidayDate` if the date is a holiday, otherwise `None`.
 | 
			
		||||
    pub fn is_holiday(&self, country: CountryState, year: i32, date: Date) -> Option<HolidayDate> {
 | 
			
		||||
        self.get_years_holidays(country, year)
 | 
			
		||||
            .iter()
 | 
			
		||||
@ -80,15 +91,19 @@ impl HolidayChecker {
 | 
			
		||||
            })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Internal method to retrieve holidays for a specific year and state
 | 
			
		||||
    /// Retrieves the list of holidays for the specified country and year.
 | 
			
		||||
    ///
 | 
			
		||||
    /// This method is internal and should not be called directly. It is used by the public methods
 | 
			
		||||
    /// to get the list of holidays for a given country and year.
 | 
			
		||||
    ///
 | 
			
		||||
    /// # 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
 | 
			
		||||
    ///
 | 
			
		||||
    /// * `country` - The country and state for which to retrieve the holidays.
 | 
			
		||||
    /// * `year` - The year for which to retrieve the holidays.
 | 
			
		||||
    ///
 | 
			
		||||
    /// # Returns
 | 
			
		||||
    /// A vector of HolidayDate for the specified year and state
 | 
			
		||||
    ///
 | 
			
		||||
    /// A vector of `HolidayDate` objects representing the holidays for the specified country and year.
 | 
			
		||||
    fn get_years_holidays(&self, country: CountryState, year: i32) -> Vec<HolidayDate> {
 | 
			
		||||
        match country {
 | 
			
		||||
            CountryState::DE(state) => self
 | 
			
		||||
@ -128,32 +143,6 @@ impl HolidayChecker {
 | 
			
		||||
                })
 | 
			
		||||
                .collect(),
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // holidays
 | 
			
		||||
        //     .iter()
 | 
			
		||||
        //     .filter_map(|holiday| {
 | 
			
		||||
        //         // check if holiday is active
 | 
			
		||||
        //         if !holiday.is_active(year, all_states_identifier, state) {
 | 
			
		||||
        //             return None;
 | 
			
		||||
        //         }
 | 
			
		||||
        //         match holiday.date {
 | 
			
		||||
        //             HDate::Calculated(calc_fn) => {
 | 
			
		||||
        //                 // For holidays with calculation function
 | 
			
		||||
        //                 Some(HolidayDate {
 | 
			
		||||
        //                     date: calc_fn(year),
 | 
			
		||||
        //                     name: holiday.name.clone(),
 | 
			
		||||
        //                 })
 | 
			
		||||
        //             }
 | 
			
		||||
        //             HDate::Fixed(month, day) => {
 | 
			
		||||
        //                 // For fixed date holidays
 | 
			
		||||
        //                 Some(HolidayDate {
 | 
			
		||||
        //                     date: Date::from_calendar_date(year, month, day).unwrap(),
 | 
			
		||||
        //                     name: holiday.name.clone(),
 | 
			
		||||
        //                 })
 | 
			
		||||
        //             }
 | 
			
		||||
        //         }
 | 
			
		||||
        //     })
 | 
			
		||||
        //     .collect()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -163,13 +152,6 @@ impl HolidayChecker {
 | 
			
		||||
/// * `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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user