Something went wrong. Try again.
A Zig client library for the Healthchecks.io ping API, for signaling that a scheduled job started, finished, or failed.
Something went wrong. Try again.
4.8 kB · 162 lines
Zig
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163// SPDX-FileCopyrightText: © 2026 Jeffrey C. Ollie <jeff@ocjtech.us>//// SPDX-License-Identifier: MIT
const Run = @This();
const std = @import("std");
const UUID = @import("uuid").UUID;
const Client = @import("Client.zig");const Check = @import("Check.zig");
check: *Check,id: UUID,
pub fn init(check: *Check) Run { const rng = check.client.rng(); const id: UUID = .new( .{ .v4 = .{ .rng = rng }, }, ); return .{ .check = check, .id = id, };}
pub fn allocator(self: *Run) std.mem.Allocator { return self.check.allocator();}
pub fn start(self: *Run, payload: ?[]const u8) !std.http.Status { var uri_buf: [8192]u8 = undefined; const len = len: { const tmp = try std.fmt.bufPrint( &uri_buf, "{f}/start?rid={f}", .{ self.check.id, self.id }, ); break :len tmp.len; }; var aux_buf: []u8 = &uri_buf; const uri = try std.Uri.resolveInPlace(self.check.client.base_uri, len, &aux_buf);
const result = try self.check.client.client.fetch(.{ .method = if (payload) |_| .POST else .GET, .location = .{ .uri = uri }, .payload = payload, .headers = .{ .user_agent = .{ .override = self.check.client.user_agent }, .content_type = .{ .override = "text/plain; charset=UTF-8" }, }, });
return result.status;}
pub fn success(self: *Run, payload: ?[]const u8) !std.http.Status { var uri_buf: [8192]u8 = undefined; const len = len: { const tmp = try std.fmt.bufPrint( &uri_buf, "{f}?rid={f}", .{ self.check.id, self.id }, ); break :len tmp.len; }; var aux_buf: []u8 = &uri_buf; const uri = try std.Uri.resolveInPlace(self.check.client.base_uri, len, &aux_buf);
const result = try self.check.client.client.fetch(.{ .method = if (payload) |_| .POST else .GET, .location = .{ .uri = uri }, .payload = payload, .headers = .{ .user_agent = .{ .override = self.check.client.user_agent }, .content_type = .{ .override = "text/plain; charset=UTF-8" }, }, });
return result.status;}
pub fn fail(self: *Run, payload: ?[]const u8) !std.http.Status { var uri_buf: [8192]u8 = undefined; const len = len: { const tmp = try std.fmt.bufPrint( &uri_buf, "{f}/fail?rid={f}", .{ self.check.id, self.id }, ); break :len tmp.len; }; var aux_buf: []u8 = &uri_buf; const uri = try std.Uri.resolveInPlace(self.check.client.base_uri, len, &aux_buf);
const result = try self.check.client.client.fetch(.{ .method = if (payload) |_| .POST else .GET, .location = .{ .uri = uri }, .payload = payload, .headers = .{ .user_agent = .{ .override = self.check.client.user_agent }, .content_type = .{ .override = "text/plain; charset=UTF-8" }, }, });
return result.status;}
pub fn log(self: *Run, payload: ?[]const u8) !std.http.Status { var uri_buf: [8192]u8 = undefined; const len = len: { const tmp = try std.fmt.bufPrint( &uri_buf, "{f}/log?rid={f}", .{ self.check.id, self.id }, ); break :len tmp.len; }; var aux_buf: []u8 = &uri_buf; const uri = try std.Uri.resolveInPlace(self.check.client.base_uri, len, &aux_buf);
const result = try self.check.client.client.fetch(.{ .method = if (payload) |_| .POST else .GET, .location = .{ .uri = uri }, .payload = payload, .headers = .{ .user_agent = .{ .override = self.check.client.user_agent }, .content_type = .{ .override = "text/plain; charset=UTF-8" }, }, });
return result.status;}
pub fn exitStatus(self: *Run, exit_status: u8, payload: ?[]const u8) !std.http.Status { var uri_buf: [8192]u8 = undefined; const len = len: { const tmp = try std.fmt.bufPrint( &uri_buf, "{f}/{d}?rid={f}", .{ self.check.id, exit_status, self.id }, ); break :len tmp.len; }; var aux_buf: []u8 = &uri_buf; const uri = try std.Uri.resolveInPlace(self.check.client.base_uri, len, &aux_buf);
const result = try self.check.client.client.fetch(.{ .method = if (payload) |_| .POST else .GET, .location = .{ .uri = uri }, .payload = payload, .headers = .{ .user_agent = .{ .override = self.check.client.user_agent }, .content_type = .{ .override = "text/plain; charset=UTF-8" }, }, });
return result.status;}