- primeira página
- Lista de blogs
- Artigo detalhado
Build a Time Tracking App with Rust and Time API for Meal Planning
霓
霓虹螺蛳粉
Meal Planning
Time API
Time Tracking
AMAMAMAM-09-17

Here's the Rust time tracking app article following all your requirements:
# Build a Time Tracking App with Rust and Time API for Meal Planning
Rust's performance and safety make it perfect for building time tracking apps. We'll create a meal planning tracker using chrono and system time APIs. This app will help schedule cooking times and track meal durations.
## Why Choose Rust for Time Tracking
Rust guarantees memory safety without garbage collection. This prevents crashes during long-running time tracking sessions. The borrow checker ensures thread-safe time calculations. Rust's low overhead means precise timing measurements.

## Setting Up the Project
Create a new project:
```rust
cargo new meal_time_tracker
cd meal_time_tracker
Add dependencies to Cargo.toml:
[dependencies]
chrono = "0.4"
serde = { version = "1.0", features = ["derive"] }
Core Time Tracking Structs
Define your main tracking structure:
use chrono::{DateTime, Duration, Local};
struct MealTime {
name: String,
start: DateTime<Local>,
duration: Duration,
meal_type: MealType,
}
enum MealType {
Breakfast,
Lunch,
Dinner,
Snack,
}
Implementing Time Calculations
Add duration validation:
impl MealTime {
fn new(name: String, start: DateTime<Local>, minutes: i64, meal_type: MealType) -> Result<Self, String> {
if minutes < 15 {
return Err("Minimum 15 minutes required".to_string());
}
if minutes > 180 {
return Err("Maximum 3 hours allowed".to_string());
}
Ok(Self {
name,
start,
duration: Duration::minutes(minutes),
meal_type,
})
}
}
Storing and Querying Meal Times
Create a time tracker with efficient lookups:
use std::collections::BTreeMap;
struct MealTracker {
meals: BTreeMap<DateTime<Local>, MealTime>,
}
impl MealTracker {
fn add_meal(&mut self, meal: MealTime) -> Result<(), String> {
let end = meal.start + meal.duration;
for (existing_start, existing_meal) in &self.meals {
let existing_end = *existing_start + existing_meal.duration;
if meal.start < existing_end && end > *existing_start {
return Err("Time conflict with existing meal".to_string());
}
}
self.meals.insert(meal.start, meal);
Ok(())
}
}
Serializing Meal Plans
Save and load meal schedules:
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct SerializableMeal {
name: String,
start: String,
duration_minutes: i64,
meal_type: String,
}
impl MealTracker {
fn to_json(&self) -> String {
let serializable: Vec<SerializableMeal> = self.meals
.values()
.map(|m| SerializableMeal {
name: m.name.clone(),
start: m.start.to_rfc3339(),
duration_minutes: m.duration.num_minutes(),
meal_type: match m.meal_type {
MealType::Breakfast => "breakfast",
MealType::Lunch => "lunch",
MealType::Dinner => "dinner",
MealType::Snack => "snack",
}.to_string(),
})
.collect();
serde_json::to_string(&serializable).unwrap()
}
}
Advanced Time Features
Implement time zone support:
use chrono_tz::Tz;
fn convert_timezone(meal: &MealTime, tz: Tz) -> DateTime<Tz> {
meal.start.with_timezone(&tz)
}
Testing Your Time Tracker
Add unit tests for edge cases:
#[cfg(test)]
mod tests {
use super::*;
use chrono::TimeZone;
#[test]
fn test_meal_overlap() {
let local = Local::now();
let mut tracker = MealTracker { meals: BTreeMap::new() };
let breakfast = MealTime::new(
"Omelette".to_string(),
local,
30,
MealType::Breakfast
).unwrap();
tracker.add_meal(breakfast).unwrap


