Skip to documentation
SLOP

tiny.choir.product.recipe

Reference tiny.choir product recipe

Defined in product.

API (7)

Actions

Public operations.

Types and contracts

Public types and contracts.

Values and defaults

Public values and defaults.

No direct callersNo direct callsproductrecipe
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Called byCallsprivate sourcelib.choir.src.product.operation.JobDatacreateproduct.operationcaptureproduct.operationregisterKindtest sourcelib.choir.src.product.recipetest: operation recipe distinguishes ...private sourcelib.choir.src.product.recipeclassifyproduct.recipedecode
Static calls · unresolved targets: 0 · external targets: 5.
Called byCallstest sourcelib.choir.src.product.recipetest: operation recipe distinguishes ...private sourcelib.choir.src.product.recipeclassifyproduct.recipeencode
Static calls · unresolved targets: 0 · external targets: 6.

Source: lib/choir/src/product/recipe.zig

zig
const std = @import("std");const ir = @import("../core/root.zig");const revision = @import("root.zig").revision;pub const version: u32 = 1;pub const ArithmeticPolicy = ir.interfaces.effects.ArithmeticPolicy;/// The effective Context policy is an input, not a derived permission bit.pub const Recipe = struct {    arithmetic: ArithmeticPolicy,    policy: []const u8,    pub fn requireContext(self: Recipe, context: *const ir.Context) !void {        if (!std.meta.eql(self.arithmetic, context.arithmetic_policy)) {            return error.UnrecordedArithmeticPolicy;        }    }    pub fn restore(self: Recipe, context: *ir.Context) void {        context.arithmetic_policy = self.arithmetic;    }};pub fn encode(allocator: std.mem.Allocator, recipe: Recipe) ![]u8 {    comptime classify();    var writer = revision.record.Writer.init(allocator);    defer writer.deinit();    try writer.writeInt(u32, version);    inline for (@typeInfo(ArithmeticPolicy).@"struct".field_names) |field| {        try writer.writeBool(@field(recipe.arithmetic, field));    }    try writer.writeBlob(recipe.policy);    return writer.finish();}pub fn decode(bytes: []const u8) !Recipe {    comptime classify();    var reader = try revision.record.Reader.init(bytes);    if (try reader.readInt(u32) != version) return error.UnknownRecipeSchema;    var arithmetic: ArithmeticPolicy = undefined;    inline for (@typeInfo(ArithmeticPolicy).@"struct".field_names) |field| {        @field(arithmetic, field) = try reader.readBool();    }    const policy = try reader.readBlob();    if (!reader.atEnd()) return error.InvalidRecipe;    return .{ .arithmetic = arithmetic, .policy = policy };}fn classify() void {    revision.record.requireFields(Recipe, &.{ "arithmetic", "policy" });    revision.record.requireFields(ArithmeticPolicy, &.{        "exceptions_masked", "default_rounding", "environment_observable",    });}test "operation recipe distinguishes all three effective arithmetic policy inputs" {    const allocator = std.testing.allocator;    const original = try encode(allocator, .{ .arithmetic = .{}, .policy = "strict" });    defer allocator.free(original);    inline for (@typeInfo(ArithmeticPolicy).@"struct".field_names) |field| {        var changed: ArithmeticPolicy = .{};        @field(changed, field) = !@field(changed, field);        const bytes = try encode(allocator, .{ .arithmetic = changed, .policy = "strict" });        defer allocator.free(bytes);        try std.testing.expect(!std.mem.eql(u8, original, bytes));        const decoded = try decode(bytes);        try std.testing.expectEqualDeep(changed, decoded.arithmetic);        try std.testing.expectEqualStrings("strict", decoded.policy);    }}

Source: lib/choir/src/product/root.zig:48

zig
pub const recipe = @import("recipe.zig");

Audit

Definitions8
Public names8
Members2
Version26.7.0
Revisiondaab053ee433