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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/// ## Log rotation
/// From version 1.0.39, you can create a `log rotator` instance which allows you to split logs by their size and duration.
/// - log_path: path to log directory;
/// - max_size (`u64`): maximum size of log file;
/// - max_life (`std::time::Duration`): maximum lifetime of log file;
/// 
/// Here's an example:
/// ```rust
/// use logger_rust::*; // importing 
/// use std::{
///     path::PathBuf,
///     time::Duration
/// };
/// 
/// fn main() {
///     set_log_level(LogLevel::File);
///     set_log_path(LogConfig::Rotator(LogRotatorConfig::new(
///         PathBuf::from("C:/Users/JK/Desktop"),
///         5 * 1024 * 1024,
///         Duration::from_secs(3600),
///     )));
/// }
/// ```

use std::{
    time::Duration,
    path::PathBuf,
};
pub enum LogConfig {
    /// # LogConfig enum
    /// Defines the Path variable as std::PathBuf for path
    /// And a Rotator variable linked to the LogRotatorConfig implementor
    Path(LogPath),
    Rotator(LogRotatorConfig),
}

pub enum LogPath {
    /// # LogPath enum
    /// Defines the Path variable as std::PathBuf for path
    /// What should i even write here and why?
    Path(PathBuf),
}

pub struct LogRotatorConfig {
    /// # LogRotatorConfig struct
    /// Defines the public variables for LogRotator instanse
    /// `log_path` = string
    /// `max-size` = u64 (e.g 5 * 1024 * 1024)
    /// `max_time` = time::Duration
    pub log_path: PathBuf,
    pub max_size: u64,
    pub max_time: Duration,
}

impl LogRotatorConfig {
    pub fn new(log_path: PathBuf, max_size: u64, max_time: Duration) -> Self {
        //! # LogRotatorConfig::New
        //! The inializer for configuration of log rotator:
        //! ```rust
        //! use logger_rust::*;
        //! use std::time::Duration;
        //! use std::path::PathBuf;
        //! 
        //! fn main() {
        //!     set_log_level(LogLevel::File);
        //!     set_log_path(LogConfig::Rotator(LogRotatorConfig::new(
        //!         PathBuf::from("C:/Users/qruie/Documents"), // Logging directory
        //!         5 * 1024 * 1024, // 5MB
        //!         Duration::from_secs(2), // Duration for log splits
        //!     )));
        //! }
        //! ```
        Self {
            log_path,
            max_size,
            max_time,
        }
    }
}

impl From<&str> for LogPath {
/// `From` trait implementation for `LogPath` that allows it to be constructed from a string slice.
///
/// # Examples
///
/// ```
/// use logger_rust::*;
///
/// fn main() {
///     set_log_level(LogLevel::File);
///     set_log_path(LogConfig::Path(LogPath::from("C:/Users/qruie/Documents")));
///     // ..
/// }
/// ```
    fn from(s: &str) -> Self {
        Self::Path(PathBuf::from(s))
    }
}

impl From<PathBuf> for LogPath {
/// `From` trait implementation for `LogPath` that allows it to be constructed from a `PathBuf`.
///
/// # Examples
///
/// ```
/// use logger_rust::*;
/// use std::path::PathBuf;
///
/// fn main() {
///     set_log_level(LogLevel::File);
///     set_log_path(LogConfig::Path(LogPath::from("C:/Users/qruie/Documents")));
///     // ..
/// }
/// ```
    fn from(path: PathBuf) -> Self {
        Self::Path(path)
    }
}