Skip to main content

Productivity

Struct Productivity 

Source
pub struct Productivity {
    pub workday: Workday,
    pub short_pauses: Vec<Pause>,
    pub long_pauses: Vec<Pause>,
    pub config: ProductivityConfig,
}
Expand description

The central productivity calculation, with the data it runs on.

The split into short and long pauses drives the whole formula: long pauses shrink the available time, short ones count against it.

Fields§

§workday: Workday

The workday record containing start/end times

§short_pauses: Vec<Pause>

Short automatic pauses (< min_pause_duration, not in database)

§long_pauses: Vec<Pause>

Long pauses (>= min_pause_duration, plus any manual protected pauses)

§config: ProductivityConfig

Productivity configuration settings and thresholds

Implementations§

Source§

impl Productivity

Source

pub fn new(workday: &Workday) -> Result<Self>

Loads the workday’s pauses, split at min_pause_duration from the monitor config.

use kasl::libs::productivity::Productivity;
use kasl::db::workdays::Workdays;
use chrono::Local;

let mut workdays = Workdays::new()?;
let workday = workdays.fetch(Local::now().date_naive())?.unwrap();
let productivity = Productivity::new(&workday)?;
let current_productivity = productivity.calculate_productivity();
println!("Current productivity: {:.1}%", current_productivity);
Source

pub fn with_test_data( workday: &Workday, short_pauses: Vec<Pause>, long_pauses: Vec<Pause>, ) -> Self

Builds a calculator from explicit data, bypassing config and database - for tests.

use kasl::libs::productivity::Productivity;
use kasl::db::workdays::Workday;
use chrono::Local;

let workday = Workday {
    id: 1,
    date: Local::now().date_naive(),
    start: Local::now().naive_local(),
    end: None,
};
let productivity = Productivity::with_test_data(
    &workday,
    vec![],
    vec![]
);
let result = productivity.calculate_productivity();
Source

pub fn is_below_threshold(&self) -> bool

Reports whether productivity has fallen below the configured threshold.

The check is suppressed early in the day: a short elapsed period makes the ratio swing wildly on a single pause, so warning then would be noise. Once min_workday_fraction_before_suggest of the expected workday has passed, the figure is stable enough to act on.

Source

pub fn calculate_productivity(&self) -> f64

Returns the day’s productivity percentage, clamped to 0-100.

(work - short pauses) / work, where work is the gross day minus long pauses. An ongoing day is measured up to now (via crate::libs::report::workday_end_time); a day with no work time yet reads 0.

use kasl::libs::productivity::Productivity;
use kasl::db::workdays::Workday;
use chrono::Local;

let workday = Workday {
    id: 1,
    date: Local::now().date_naive(),
    start: Local::now().naive_local(),
    end: None,
};
let productivity_instance = Productivity::with_test_data(&workday, vec![], vec![]);
let productivity = productivity_instance.calculate_productivity();

if productivity >= 75.0 {
    println!("Good productivity: {:.1}%", productivity);
} else {
    println!("Consider taking a break to improve focus");
}

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