MoonBit 原生 iCalendar 解析器和 RRULE 日程展开库。
moon add ciqingweiyang/mooncalmoon check
moon build
moon test
moon run cmd/main
moon run cmd/main -- --json
moon run examples/basicmatch @mooncal.parse(@mooncal.sample_ics) {
Ok(calendar) => {
let from = @mooncal.DateTime(2026, 8, 1)
let until = @mooncal.DateTime(2026, 8, 31)
match @mooncal.occurrences_between(calendar, from, until, limit=32) {
Ok(items) => println(@mooncal.occurrences_to_json(items))
Err(err) => println(@mooncal.error_to_text(err))
}
let due = @mooncal.tasks_due_on_date(calendar, @mooncal.DateTime(2026, 8, 18))
println(@mooncal.task_to_json(due[0]))
}
Err(err) => println(@mooncal.error_to_text(err))
}moon run cmd/main
moon run cmd/main -- --json| 接口 | 用途 |
|---|---|
| parse(input) | 解析 VCALENDAR 文档 |
| parse_rule(input) | 解析单条 RRULE 值 |
| occurrences_between(calendar, from, until, limit=...) | 展开指定时间窗口内的事件 |
| occurrences_on_date(calendar, date) | 展开指定日期的事件 |
| next_occurrences(calendar, after) | 查询后续即将发生的事件 |
| open_tasks(calendar) | 查询未完成、未取消的任务 |
| completed_tasks(calendar) | 查询已完成任务 |
| overdue_tasks(calendar, as_of) | 按调用方给定日期查询逾期任务 |
| tasks_due_on_date(calendar, date) | 查询指定日期到期任务 |
| high_priority_tasks(calendar) | 查询高优先级任务 |
| busy_periods_between(calendar, from, until) | 查询时间窗口内的忙碌时间段 |
| free_periods_between(calendar, from, until) | 查询显式空闲时间段 |
| time_is_busy(calendar, moment) | 判断某个时刻是否忙碌 |
| analyze(input) | 解析日历并生成摘要 |
| validate_calendar(calendar) | 返回日历验证诊断 |
| calendar_to_json(calendar) | 输出解析后的日历 JSON |
| calendar_to_ics(calendar) | 导出基础 VCALENDAR 文本 |
| summary_to_text(summary) | 输出适合命令行展示的文本摘要 |
| error_to_text(err) | 将类型化错误转换为可读文本 |
pub(all) struct CalendarSummary {
event_count : Int
recurring_event_count : Int
all_day_event_count : Int
task_count : Int
open_task_count : Int
completed_task_count : Int
blocked_time_count : Int
blocked_period_count : Int
earliest : DateTime?
latest : DateTime?
diagnostics : Array[Diagnostic]
} derive(Debug)pub(all) struct Event {
uid : String
start : DateTime
end : DateTime?
summary : String
description : String?
location : String?
status : String?
url : String?
categories : Array[String]
created : DateTime?
last_modified : DateTime?
sequence : Int?
rrule : RRule?
duration : Duration?
rdate : Array[DateTime]
exdate : Array[DateTime]
raw : Array[IcsProperty]
} derive(Debug)pub(all) struct FreeBusy {
uid : String?
start : DateTime?
end : DateTime?
dtstamp : DateTime?
organizer : String?
attendees : Array[String]
comments : Array[String]
url : String?
periods : Array[FreeBusyPeriod]
raw : Array[IcsProperty]
} derive(Debug)pub(all) enum MoonCalError {
InvalidLine(line~ : Int, message~ : String)
InvalidProperty(line~ : Int, name~ : String, message~ : String)
InvalidDateTime(value~ : String)
InvalidRRule(value~ : String, message~ : String)
InvalidCalendar(message~ : String)
MissingEventField(field~ : String)
MissingTaskField(field~ : String)
UnsupportedFeature(feature~ : String)
LimitExceeded(limit~ : Int)
} derive(Eq, Debug)pub(all) struct Task {
uid : String
start : DateTime?
due : DateTime?
completed : DateTime?
created : DateTime?
last_modified : DateTime?
summary : String
description : String?
status : String?
priority : Int?
percent_complete : Int?
categories : Array[String]
url : String?
related_to : Array[String]
raw : Array[IcsProperty]
} derive(Debug)fn busy_periods_between(calendar : Calendar, from : DateTime, until : DateTime) -> Array[FreeBusyPeriod]fn expand_calendar_between(calendar : Calendar, from : DateTime, until : DateTime, limit? : Int) -> Result[Array[Occurrence], MoonCalError]fn expand_event_between(event : Event, from : DateTime, until : DateTime, limit? : Int) -> Result[Array[Occurrence], MoonCalError]fn free_periods_between(calendar : Calendar, from : DateTime, until : DateTime) -> Array[FreeBusyPeriod]fn freebusy_periods_between(calendar : Calendar, from : DateTime, until : DateTime) -> Array[FreeBusyPeriod]fn next_occurrences(calendar : Calendar, after : DateTime, limit? : Int) -> Result[Array[Occurrence], MoonCalError]fn occurrences_between(calendar : Calendar, from : DateTime, until : DateTime, limit? : Int) -> Result[Array[Occurrence], MoonCalError]fn occurrences_on_date(calendar : Calendar, date : DateTime, limit? : Int) -> Result[Array[Occurrence], MoonCalError]let package_name : Stringlet sample_ics : StringMoonBit 原生 iCalendar 解析器和 RRULE 日程展开库。