Skip to main content

Workdays

Struct Workdays 

Source
pub struct Workdays {
    pub conn: Connection,
}
Expand description

Workday table access.

Fields§

§conn: Connection

Implementations§

Source§

impl Workdays

Source

pub fn new() -> Result<Self>

Opens the database and ensures the workdays table exists.

use kasl::db::workdays::Workdays;

let mut workdays = Workdays::new()?;
Source

pub fn insert_start(&mut self, date: NaiveDate) -> Result<()>

Starts a workday at the current time; a no-op if the date already has one, so repeated calls from the monitor are safe.

use chrono::Local;

let mut workdays = Workdays::new()?;
let today = Local::now().date_naive();
workdays.insert_start(today)?;
Source

pub fn insert_end(&mut self, date: NaiveDate) -> Result<()>

Stamps the current time as the day’s end; calling again re-stamps.

Known gap: when no workday exists for the date, the UPDATE matches nothing and this still returns Ok - kasl end then reports success without having written anything (tracked for the doctor stage).

use chrono::Local;

let mut workdays = Workdays::new()?;
let today = Local::now().date_naive();

workdays.insert_start(today)?;
workdays.insert_end(today)?;
Source

pub fn fetch(&mut self, date: NaiveDate) -> Result<Option<Workday>>

Fetches the workday for a date, or None if the date has none.

use chrono::Local;

let mut workdays = Workdays::new()?;
let today = Local::now().date_naive();

if let Some(workday) = workdays.fetch(today)? {
    println!("Work started at: {}", workday.start);
    if let Some(end_time) = workday.end {
        println!("Work ended at: {}", end_time);
    } else {
        println!("Work session is still active");
    }
} else {
    println!("No work session recorded for today");
}
Source

pub fn fetch_month(&mut self, date: NaiveDate) -> Result<Vec<Workday>>

Fetches every workday in the calendar month containing date.

use chrono::Local;

let mut workdays = Workdays::new()?;
let current_month = Local::now().date_naive();

let monthly_workdays = workdays.fetch_month(current_month)?;
println!("Found {} workdays this month", monthly_workdays.len());

for workday in monthly_workdays {
    if let Some(end_time) = workday.end {
        let duration = end_time - workday.start;
        println!("Date: {}, Duration: {:?}", workday.date, duration);
    }
}
Source

pub fn update_start( &mut self, date: NaiveDate, new_start: NaiveDateTime, ) -> Result<()>

Sets the day’s start to a specific timestamp; errors if the date has no workday.

use chrono::{Local, NaiveDateTime};

let mut workdays = Workdays::new()?;
let today = Local::now().date_naive();

let corrected_start = NaiveDateTime::parse_from_str(
    &format!("{} 09:00:00", today.format("%Y-%m-%d")),
    "%Y-%m-%d %H:%M:%S"
)?;

workdays.update_start(today, corrected_start)?;
Source

pub fn update_end( &mut self, date: NaiveDate, new_end: Option<NaiveDateTime>, ) -> Result<()>

Sets the day’s end to a specific timestamp, or reopens the day with None; errors if the date has no workday.

use chrono::{Local, NaiveDateTime};

let mut workdays = Workdays::new()?;
let today = Local::now().date_naive();

let end_time = NaiveDateTime::parse_from_str(
    &format!("{} 17:30:00", today.format("%Y-%m-%d")),
    "%Y-%m-%d %H:%M:%S"
)?;
workdays.update_end(today, Some(end_time))?;

// Reopen the day
workdays.update_end(today, None)?;

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more