///|
/// Build a photographer's ordered event list, never unwrap a polar missing event.
fn schedule(date : @sun.Instant, site : @sun.Observer) -> String {
let cfg = @sun.solar_config(20.0, [
@sun.solar_angle(-4.0, "blueEndAM", "blueStartPM").unwrap(),
]).unwrap()
let t = @sun.sun_times_with(date, site, cfg)
let mut report = "地面摄影时刻表(UTC;观察点高于可见地平线 20 m)\n"
let state = match t.state {
Crosses => "正常升落\n"
AlwaysAbove => "极昼,无日出日落事件\n"
AlwaysBelow => "极夜,无日出日落事件\n"
}
report += "标准日出日落状态:" + state
for
item in [
("dawn", "晨间蓝调开始 -6°"),
("blueEndAM", "晨间蓝调结束 -4°"),
("sunrise", "日出"),
("goldenHourEnd", "晨间金色时段结束 +6°"),
("goldenHour", "傍晚金色时段开始 +6°"),
("sunset", "日落"),
("blueStartPM", "傍晚蓝调开始 -4°"),
("dusk", "傍晚蓝调结束 -6°"),
] {
let rendered = match t.event(item.0) {
Some(time) => time.to_iso_utc()
None => "当日未达到这个高度角"
}
report += item.1 + ":" + rendered + "\n"
}
report +
"不含天气、云量和建筑遮挡;金色/蓝调时段是高度角约定,不保证照片光照。\n"
}
///|
fn main {
println("上海 2026-09-14,31.23°N 121.47°E")
println(
schedule(
@sun.utc(2026, 9, 14).unwrap(),
@sun.observer(31.23, 121.47).unwrap(),
),
)
println("对照:朗伊尔城夏至")
println(
schedule(
@sun.utc(2026, 6, 21).unwrap(),
@sun.observer(78.2232, 15.6469).unwrap(),
),
)
}