temporalz/example/src/root.zig
2026-03-14 19:00:35 +06:00

482 lines
15 KiB
Zig

const std = @import("std");
const builtin = @import("builtin");
const Temporal = @import("temporalz");
pub fn run(allocator: std.mem.Allocator, io_optional: ?std.Io) !void {
// --- Instant --- //
const instant = try Temporal.Instant.init(1_704_067_200_000_000_000); // 2024-01-01 00:00:00 UTC
defer instant.deinit();
std.log.info(
\\Instant
\\ - milliseconds: {}
\\ - nanoseconds: {}
\\ - toString(): {s}
\\
\\
, .{
instant.epochMilliseconds(),
instant.epochNanoseconds(),
try instant.toString(allocator, .{}),
});
// --- Duration --- //
const dur = try Temporal.Duration.from("PT1H");
defer dur.deinit();
std.log.info(
\\Duration
\\ - nanoseconds: {}
\\ - milliseconds: {}
\\ - seconds: {}
\\ - minutes: {}
\\ - hours: {}
\\ - days: {}
\\ - weeks: {}
\\ - months: {}
\\ - years: {}
\\ - toString(): {s}
\\
\\
, .{
dur.nanoseconds(),
dur.milliseconds(),
dur.seconds(),
dur.minutes(),
dur.hours(),
dur.days(),
dur.weeks(),
dur.months(),
dur.years(),
try dur.toString(allocator, .{}),
});
// --- Now --- //
if (io_optional) |io| {
const now_instant = try Temporal.Now.instant(io);
defer now_instant.deinit();
const now_date = try Temporal.Now.plainDateISO(io);
defer now_date.deinit();
const now_datetime = try Temporal.Now.plainDateTimeISO(io);
const now_time = try Temporal.Now.plainTimeISO(io);
std.log.info(
\\Now
\\ - instant: {s}
\\ - date: {s}
\\ - datetime: {s}
\\ - time: {s}
\\
\\
, .{
try now_instant.toString(allocator, .{}),
try now_date.toString(allocator, .{}),
try now_datetime.toString(allocator, .{}),
try now_time.toString(allocator),
});
}
// --- PlainDate --- //
const date = try Temporal.PlainDate.init(2024, 2, 2);
defer date.deinit();
std.log.info(
\\PlainDate
\\ - year: {}
\\ - month: {}
\\ - day: {}
\\ - toString(): {s}
\\
\\
, .{
date.year(),
date.month(),
date.day(),
try date.toString(allocator, .{}),
});
// --- PlainDateTime --- //
const dt = try Temporal.PlainDateTime.init(2024, 2, 2, 13, 45, 30, 123, 456, 789);
std.log.info(
\\PlainDateTime
\\ - year: {}
\\ - month: {}
\\ - day: {}
\\ - hour: {}
\\ - minute: {}
\\ - second: {}
\\ - toString(): {s}
\\
\\
, .{
dt.year(),
dt.month(),
dt.day(),
dt.hour(),
dt.minute(),
dt.second(),
try dt.toString(allocator, .{}),
});
// --- PlainMonthDay --- //
const md = try Temporal.PlainMonthDay.init(2, 2, null);
std.log.info(
\\PlainMonthDay
\\ - monthCode: {s}
\\ - day: {}
\\ - toString(): {s}
\\
\\
, .{
try md.monthCode(allocator),
md.day(),
try md.toString(allocator),
});
// --- PlainTime --- //
const tm = try Temporal.PlainTime.init(13, 45, 30, 123, 456, 789);
std.log.info(
\\PlainTime
\\ - hour: {}
\\ - minute: {}
\\ - second: {}
\\ - toString(): {s}
\\
\\
, .{
tm.hour(),
tm.minute(),
tm.second(),
try tm.toString(allocator),
});
// --- PlainYearMonth --- //
const ym = try Temporal.PlainYearMonth.init(2024, 2, null);
std.log.info(
\\PlainYearMonth
\\ - year: {}
\\ - month: {}
\\ - toString(): {s}
\\
\\
, .{ ym.year(), ym.month(), try ym.toString(allocator) });
// --- ZonedDateTime --- //
const tz = try Temporal.ZonedDateTime.TimeZone.init("UTC");
// Example: 2024-02-02T13:45:30.123456789Z in nanoseconds since epoch
const zdt_epoch_ns: i128 = 1706881530123456789;
const zdt = try Temporal.ZonedDateTime.fromEpochNanoseconds(zdt_epoch_ns, tz);
defer zdt.deinit();
std.log.info(
\\ZonedDateTime
\\ - year: {}
\\ - month: {}
\\ - day: {}
\\ - hour: {}
\\ - minute: {}
\\ - second: {}
\\ - timeZone: {s}
\\ - toString(): {s}
\\
\\
, .{
zdt.year(),
zdt.month(),
zdt.day(),
zdt.hour(),
zdt.minute(),
zdt.second(),
try zdt.timeZoneId(allocator),
try zdt.toString(allocator, .{}),
});
// ----
// More complex Temporal API examples
// ----
// Duration arithmetic
const dur1 = try Temporal.Duration.from("P1DT2H");
const dur2 = try Temporal.Duration.from("PT30M");
const dur_sum = try dur1.add(dur2);
std.log.info(
\\Duration Arithmetic
\\ - dur1: {s}
\\ - dur2: {s}
\\ - dur1 + dur2: {s}
\\
\\
, .{
try dur1.toString(allocator, .{}),
try dur2.toString(allocator, .{}),
try dur_sum.toString(allocator, .{}),
});
// Instant comparison and arithmetic
const inst1 = try Temporal.Instant.init(1_704_067_200_000_000_000);
const inst2 = try Temporal.Instant.init(1_704_153_600_000_000_000); // +1 day
const inst_diff = try inst2.since(inst1, Temporal.Instant.DifferenceSettings{});
std.log.info(
\\Instant Comparison
\\ - inst1: {s}
\\ - inst2: {s}
\\ - inst2.since(inst1): {s}
\\
\\
, .{
try inst1.toString(allocator, .{}),
try inst2.toString(allocator, .{}),
try inst_diff.toString(allocator, .{}),
});
// PlainDate to PlainDateTime and back
const pd = try Temporal.PlainDate.init(2024, 2, 2);
const pdt = try pd.toPlainDateTime(try Temporal.PlainTime.init(12, 0, 0, 0, 0, 0));
std.log.info(
\\PlainDate/PlainDateTime Conversion
\\ - PlainDate: {s}
\\ - toPlainDateTime(12:00): {s}
\\ - toPlainDate(): {s}
\\
\\
, .{
try pd.toString(allocator, .{}),
try pdt.toString(allocator, .{}),
try (try pdt.toPlainDate()).toString(allocator, .{}),
});
// ZonedDateTime to Instant and back
const zdt2 = try Temporal.ZonedDateTime.fromEpochNanoseconds(1706881530123456789, tz);
const zdt2_inst = try zdt2.toInstant();
const zdt2_from_inst = try Temporal.ZonedDateTime.fromEpochNanoseconds(zdt2_inst.epochNanoseconds(), tz);
std.log.info(
\\ZonedDateTime/Instant Conversion
\\ - ZonedDateTime: {s}
\\ - toInstant(): {s}
\\ - fromEpochNanoseconds(instant): {s}
\\
\\
, .{
try zdt2.toString(allocator, .{}),
try zdt2_inst.toString(allocator, .{}),
try zdt2_from_inst.toString(allocator, .{}),
});
// ----
// Further more complex examples covering more methods
// ----
// Duration: abs, negated, round, subtract, total, valueOf
const dur_neg = dur.negated();
const dur_abs = dur_neg.abs();
const dur_sub = try dur.subtract(dur2);
const dur_rounded = try dur.round(.{ .smallest_unit = Temporal.Duration.Unit.hour });
const dur_total_hours = try dur.total(.{ .unit = Temporal.Duration.Unit.hour });
std.log.info(
\\Duration Advanced
\\ - negated: {s}
\\ - abs: {s}
\\ - subtract dur2: {s}
\\ - round to hour: {s}
\\ - total hours: {d}
\\
\\
, .{
try dur_neg.toString(allocator, .{}),
try dur_abs.toString(allocator, .{}),
try dur_sub.toString(allocator, .{}),
try dur_rounded.toString(allocator, .{}),
dur_total_hours,
});
// Instant: add, subtract, round, equals, valueOf
const inst_add = try inst1.add(@constCast(&dur));
const inst_sub = try inst2.subtract(@constCast(&dur));
const inst_rounded = try inst1.round(.{ .smallest_unit = Temporal.Instant.Unit.second });
const inst_eq = Temporal.Instant.compare(inst1, inst1) == 0;
std.log.info(
\\Instant Advanced
\\ - add duration: {s}
\\ - subtract duration: {s}
\\ - round to second: {s}
\\ - inst1 equals inst1: {}
\\
\\
, .{
try inst_add.toString(allocator, .{}),
try inst_sub.toString(allocator, .{}),
try inst_rounded.toString(allocator, .{}),
inst_eq,
});
// PlainDate: add, subtract, with, equals, since, until, withCalendar
const date_added = try date.add(dur);
const date_sub = try date.subtract(dur);
// const date_with = try date.with(.{ .year = 2025 });
const date_eq = date.equals(date);
const date_since = try date.since(date, Temporal.PlainDate.DifferenceSettings{});
const date_until = try date.until(date, Temporal.PlainDate.DifferenceSettings{});
const date_with_cal = try date.withCalendar("iso8601");
std.log.info(
\\PlainDate Advanced
\\ - equals self: {}
\\ - add duration: {s}
\\ - subtract duration: {s}
\\ - since self: {s}
\\ - until self: {s}
\\ - withCalendar: {s}
\\ - with year=2025: {{s}}
\\
\\
,
.{
date_eq,
try date_added.toString(allocator, .{}),
try date_sub.toString(allocator, .{}),
try date_since.toString(allocator, .{}),
try date_until.toString(allocator, .{}),
try date_with_cal.toString(allocator, .{}),
// try date_with.toString(allocator, .{}),
},
);
// PlainDateTime: add, subtract, round, with, equals, since, until, withCalendar, withPlainTime
const dt_added = try dt.add(dur);
const dt_sub = try dt.subtract(dur);
const dt_rounded = try dt.round(.{ .smallest_unit = Temporal.PlainDateTime.Unit.minute });
const dt_with = try dt.with(.{ .year = 2025 });
const dt_eq = dt.equals(dt);
const dt_since = try dt.since(dt, Temporal.PlainDateTime.DifferenceSettings{});
const dt_until = try dt.until(dt, Temporal.PlainDateTime.DifferenceSettings{});
const dt_with_cal = try dt.withCalendar("iso8601");
const dt_with_time = try dt.withPlainTime(try Temporal.PlainTime.init(1, 2, 3, 4, 5, 6));
std.log.info(
\\PlainDateTime Advanced
\\ - add duration: {s}
\\ - subtract duration: {s}
\\ - round to minute: {s}
\\ - with year=2025: {s}
\\ - equals self: {}
\\ - since self: {s}
\\ - until self: {s}
\\ - withCalendar: {s}
\\ - withPlainTime: {s}
\\
\\
, .{
try dt_added.toString(allocator, .{}),
try dt_sub.toString(allocator, .{}),
try dt_rounded.toString(allocator, .{}),
try dt_with.toString(allocator, .{}),
dt_eq,
try dt_since.toString(allocator, .{}),
try dt_until.toString(allocator, .{}),
try dt_with_cal.toString(allocator, .{}),
try dt_with_time.toString(allocator, .{}),
});
// PlainTime: add, subtract, round, with, equals, since, until
const tm_added = try tm.add(dur);
const tm_sub = try tm.subtract(dur);
const tm_rounded = try tm.round(.{ .smallest_unit = Temporal.PlainTime.Unit.second });
const tm_with = try tm.with(.{ .hour = 1 });
const tm_eq = tm.equals(tm);
const tm_since = try tm.since(tm, Temporal.PlainTime.DifferenceSettings{});
const tm_until = try tm.until(tm, Temporal.PlainTime.DifferenceSettings{});
std.log.info(
\\PlainTime Advanced
\\ - add duration: {s}
\\ - subtract duration: {s}
\\ - round to second: {s}
\\ - with hour=1: {s}
\\ - equals self: {}
\\ - since self: {s}
\\ - until self: {s}
\\
\\
, .{
try tm_added.toString(allocator),
try tm_sub.toString(allocator),
try tm_rounded.toString(allocator),
try tm_with.toString(allocator),
tm_eq,
try tm_since.toString(allocator, .{}),
try tm_until.toString(allocator, .{}),
});
// PlainYearMonth: add, subtract, with, equals, since, until, withCalendar
const dur_ym = try Temporal.Duration.from("P1M");
defer dur_ym.deinit();
const ym_added = try ym.add(dur_ym);
const ym_sub = try ym.subtract(dur_ym);
const ym_with = try ym.with(.{ .year = 2025 });
const ym_eq = ym.equals(ym);
const ym_since = try ym.since(ym, Temporal.PlainYearMonth.DifferenceSettings{});
const ym_until = try ym.until(ym, Temporal.PlainYearMonth.DifferenceSettings{});
std.log.info(
\\PlainYearMonth Advanced
\\ - add duration: {s}
\\ - subtract duration: {s}
\\ - with year=2025: {s}
\\ - equals self: {}
\\ - since self: {s}
\\ - until self: {s}
\\
\\
, .{
try ym_added.toString(allocator),
try ym_sub.toString(allocator),
try ym_with.toString(allocator),
ym_eq,
try ym_since.toString(allocator, .{}),
try ym_until.toString(allocator, .{}),
});
// ZonedDateTime: add, subtract, round, with, equals, since, until, withCalendar, withPlainTime, withTimeZone
const zdt_added = try zdt.add(dur);
const zdt_sub = try zdt.subtract(dur);
const zdt_rounded = try zdt.round(.{ .smallest_unit = Temporal.ZonedDateTime.Unit.hour });
// const zdt_with = try zdt.with(allocator, .{ .year = 2025 });
const zdt_eq = zdt.equals(zdt);
const zdt_since = try zdt.since(zdt, Temporal.ZonedDateTime.DifferenceSettings{});
const zdt_until = try zdt.until(zdt, Temporal.ZonedDateTime.DifferenceSettings{});
const zdt_with_cal = try zdt.withCalendar("iso8601");
const zdt_with_time = try zdt.withPlainTime(try Temporal.PlainTime.init(1, 2, 3, 4, 5, 6));
const zdt_with_tz = try zdt.withTimeZone(tz);
std.log.info(
\\ZonedDateTime Advanced
\\ - add duration: {s}
\\ - subtract duration: {s}
\\ - round to hour: {s}
\\ - with year=2025: {{s}}
\\ - equals self: {}
\\ - since self: {s}
\\ - until self: {s}
\\ - withCalendar: {s}
\\ - withPlainTime: {s}
\\ - withTimeZone: {s}
\\
\\
, .{
try zdt_added.toString(allocator, .{}),
try zdt_sub.toString(allocator, .{}),
try zdt_rounded.toString(allocator, .{}),
// try zdt_with.toString(allocator, .{}),
zdt_eq,
try zdt_since.toString(allocator, .{}),
try zdt_until.toString(allocator, .{}),
try zdt_with_cal.toString(allocator, .{}),
try zdt_with_time.toString(allocator, .{}),
try zdt_with_tz.toString(allocator, .{}),
});
}
extern fn consoleLog(ptr: [*]u8, len: u32) void;
pub fn logFn(comptime message_level: std.log.Level, comptime scope: @TypeOf(.enum_literal), comptime format: []const u8, args: anytype) void {
if (builtin.os.tag == .freestanding) {
const prefix = if (scope == .default) "" else "(" ++ @tagName(scope) ++ ") ";
const formatted = std.fmt.allocPrint(std.heap.wasm_allocator, prefix ++ format, args) catch return;
consoleLog(formatted.ptr, formatted.len);
}
std.log.defaultLog(message_level, scope, format, args);
}
pub const std_options: std.Options = .{
.logFn = logFn,
};