utils.py•1.84 kB
"""Utility functions for Toggl MCP Server."""
from datetime import datetime, timedelta
from typing import Optional, Dict, Tuple
import logging
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def validate_date_range(start_date: str, end_date: str) -> Optional[Dict[str, str]]:
"""
Validate date range.
Returns:
None if valid, error dict otherwise
"""
try:
start = datetime.fromisoformat(start_date).date()
end = datetime.fromisoformat(end_date).date()
except ValueError:
return {"code": "INVALID_DATE_FORMAT", "message": "ISO 8601 format required (YYYY-MM-DD)"}
if end < start:
return {"code": "INVALID_DATE_RANGE", "message": "end_date must be >= start_date"}
if (end - start).days > 7:
return {"code": "DATE_RANGE_EXCEEDS_LIMIT", "message": "Max 7 days per request"}
return None
def date_range(start_date: str, end_date: str) -> list:
"""
Generate list of dates between start_date and end_date (inclusive).
Args:
start_date: ISO 8601 format (YYYY-MM-DD)
end_date: ISO 8601 format (YYYY-MM-DD)
Returns:
List of date strings in ISO 8601 format
"""
start = datetime.fromisoformat(start_date).date()
end = datetime.fromisoformat(end_date).date()
dates = []
current = start
while current <= end:
dates.append(current.isoformat())
current += timedelta(days=1)
return dates
def parse_iso_datetime(iso_str: str) -> datetime:
"""Parse ISO 8601 datetime string to datetime object."""
return datetime.fromisoformat(iso_str)
def log_info(message: str) -> None:
"""Log info message."""
logger.info(message)
def log_error(message: str) -> None:
"""Log error message."""
logger.error(message)