Zig 0.17.0-dev (Split by item) This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig standard library.
std › crypto › codecs › asn1 › der › Encoder › anyTag Private Function anyTag Doc Source Private Function std.crypto.codecs.asn1.der.Encoder.anyTag
fn anyTag (self : *Encoder , tag_ : Tag , val : anytype ) !void Params File crypto/codecs/asn1/der/Encoder.zig: 44
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 fn anyTag (self : *Encoder , tag_ : Tag , val : anytype ) !void {
const T = @TypeOf (val );
if (std .meta .hasFn (T , "encodeDer" )) return try val .encodeDer (self );
const outer_field_tag = self .field_tag ;
const start = self .buffer .data .len ;
const merged_tag = self .mergedTag (tag_ );
switch (@typeInfo (T )) {
.@"struct" => |info | {
inline for (0 ..info .field_names .len ) |i | {
const f_idx = info .field_names .len - i - 1 ;
const f_name = info .field_names [f_idx ];
const f_type = info .field_types [f_idx ];
const f_attrs = info .field_attrs [f_idx ];
const field_val = @field (val , f_name );
const field_tag = FieldTag .fromContainer (T , f_name );
// > The encoding of a set value or sequence value shall not include an encoding for any
// > component value which is equal to its default value.
const is_default = if (f_attrs .@"comptime" ) false else if (f_attrs .defaultValue (f_type )) |default_val | brk : {
break :brk std .mem .eql (u8 , std .mem .asBytes (&default_val ), std .mem .asBytes (&field_val ));
} else false ;
const is_null_optional = if (@typeInfo (f_type ) == .optional ) field_val == null else false ;
if (!is_default and !is_null_optional ) {
const start2 = self .buffer .data .len ;
self .field_tag = field_tag ;
// will merge with self.field_tag.
// may mutate self.field_tag.
try self .anyTag (Tag .fromZig (f_type ), field_val );
if (field_tag ) |ft | {
if (ft .explicit ) {
try self .length (self .buffer .data .len - start2 );
try self .tag (ft .toTag ());
self .field_tag = null ;
}
}
}
}
self .field_tag = outer_field_tag ;
},
.bool => try self .buffer .prependSlice (&[_ ]u8 {if (val ) 0xff else 0 }),
.int => try self .int (T , val ),
.@"enum" => |e | {
if (@hasDecl (T , "oids" )) {
return self .any (T .oids .enumToOid (val ));
} else {
try self .int (e .tag_type , @backingInt (val ));
}
},
.optional => if (val ) |v | return try self .anyTag (tag_ , v ) else return ,
.null => {},
else => @compileError ("cannot encode type " ++ @typeName (T )),
}
try self .length (self .buffer .data .len - start );
try self .tag (merged_tag );
}