Rust: Pull Request für simplelog fertigstellen

jb_alvarado

Lt. Junior Grade
Registriert
Sep. 2015
Beiträge
492
Hallo Allerseits,
ich verwende in einem Open Source Projekt simplelog. In älteren Versionen hatte es chrono verwendet, was dann durch time ersetzt wurde.
Ich würde es aber gerne weiterhin mit chrono verwenden, und hatte dazu einen Pull Request gestartet. Grundsätzlich würde dieser akzeptiert werden, allerdings schaffe ich es nicht die Änderungswünsche umzusetzen, dazu fehlen mir leider die Fähigkeiten.

Jetzt wollte ich mal hier fragen, ob sich jemand vorstellen könnte, hier etwas Hand anzulegen? Mein Request gibt es hier: https://github.com/Drakulix/simplelog.rs/pull/109 , Änderungswünsche sind auch mit dabei.

Die Idee war ein enum zu erweitern und ein neues zu kreieren, um Funktionen für chrono und time gleichermaßen nutzen zu können:
Rust:
// das ist erweitert
#[derive(Debug, Clone)]
pub enum TimeFormat {
    Rfc2822,
    Rfc3339,
    #[cfg(feature = "chrono")]
    Custom(Cow<'static, str>),
    #[cfg(not(feature = "chrono"))]
    Custom(&'static [time::format_description::FormatItem<'static>]),
}

// das ist neu
#[derive(Debug, Clone)]
pub enum TimeOffset {
    #[cfg(feature = "chrono")]
    Chrono(chrono::offset::FixedOffset),
    #[cfg(not(feature = "chrono"))]
    Time(time::UtcOffset),
}

Hängen tue ich jetzt einmal hier:

Rust:
    #[cfg(feature = "chrono")]
    pub fn set_time_format_custom(
        &mut self,
        time_format: Cow<'static, str>,
    ) -> &mut ConfigBuilder {
        self.0.time_format = TimeFormat::Custom(time_format);
        self
    }
    #[cfg(not(feature = "chrono"))]
    pub fn set_time_format_custom(
        &mut self,
        time_format: &'static [FormatItem<'static>],
    ) -> &mut ConfigBuilder {
        self.0.time_format = TimeFormat::Custom(time_format);
        self
    }

Wenn ich das richtig verstehe, sollen die Beiden zusammengefügt werden.

Und dann bekomme ich es nicht hin, diese Funktionen generisch zu machen und in einer abzubilden:

Rust:
#[cfg(feature = "chrono")]
#[inline(always)]
pub fn write_time<W>(write: &mut W, config: &Config) -> Result<(), Error>
where
    W: Write + Sized,
{
    let cur_time = if config.time_local {
        (chrono::Local::now() + config.time_offset).format(&*config.time_format)
    } else {
        (chrono::Utc::now() + config.time_offset).format(&*config.time_format)
    };
    write!(write, "{} ", cur_time)?;
    Ok(())
}

#[cfg(not(feature = "chrono"))]
#[inline(always)]
pub fn write_time<W>(write: &mut W, config: &Config) -> Result<(), Error>
where
    W: Write + Sized,
{
    use time::error::Format;
    use time::format_description::well_known::*;
    let time = time::OffsetDateTime::now_utc().to_offset(config.time_offset);
    let res = match config.time_format {
        TimeFormat::Rfc2822 => time.format_into(write, &Rfc2822),
        TimeFormat::Rfc3339 => time.format_into(write, &Rfc3339),
        TimeFormat::Custom(format) => time.format_into(write, &format),
    };
    match res {
        Err(Format::StdIo(err)) => return Err(err),
        Err(err) => panic!("Invalid time format: {}", err),
        _ => {}
    };
    write!(write, " ")?;
    Ok(())
}

Ich denke es ist aber wichtig sich noch mal alle Kommentare beim Pull Request anzuschauen, um ein besseres Bild zu bekommen.

Kennt sich jemand gut mit chrono und time aus und könnte sich das mal anschauen?
 
Ich denke er will, dass du aus folgendem:
Rust:
    #[cfg(feature = "chrono")]
    Custom(Cow<'static, str>),
    #[cfg(not(feature = "chrono"))]
    Custom(&'static [time::format_description::FormatItem<'static>]),
Rust:
    Custom(Cow<'static, str>),
machst.
Also beide Varianten im gleichen Format speicherst.

jb_alvarado schrieb:
Hängen tue ich jetzt einmal hier:
Wenn du das Argument zu time_format: impl Into<Cow<'static, str>> änderst und das into() dann in der Funktion nutzt, kannst du eine Variante löschen.
Dazu muss natürlich für [time::format_description::FormatItem<'static>] das Into-Trait implement werden. In anderen Worten musst du [time::format_description::FormatItem<'static>] in Cow<'static, str> konvertieren.
Implizit hast du die Funktion dann generisch gemacht.

Und ich denke, dass dann die [time::format_description::FormatItem<'static>] Variante von write_time einfach wegfallen dürfte.
 
Wie würde das Trait denn ausschauen? Was in der Richtung?:

Rust:
impl From<Cow<'static, str>> for time::format_description::FormatItem {
    fn from(self) -> Cow<'static, str> {
        Cow::Owned(self.to_string())
    }
}

Und ändert das denn nicht den Typen, den der Benutzer verwenden muss, um
set_time_format_custom() mit time zu verwenden?
 
jb_alvarado schrieb:
Was in der Richtung?:
Was in der Richtung aber genau in die andere Richtung.
Du möchtest ja von FormatItem zu Cow und nicht anders rum
 
Leider steige ich bei Traits noch nicht so recht durch und bekomme das so nicht hin. Könntest du mir ein konkreteres Beispiel geben?
 
Zurück
Oben