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 › Decoder › any Public Function any Doc Source Public Function std.crypto.codecs.asn1.der.Decoder.any
pub fn any (self : *Decoder , comptime T : type ) !T Params File crypto/codecs/asn1/der/Decoder.zig: 17
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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 pub fn any (self : *Decoder , comptime T : type ) !T {
if (std .meta .hasFn (T , "decodeDer" )) return try T .decodeDer (self );
const tag = Tag .fromZig (T ).toExpected ();
switch (@typeInfo (T )) {
.@"struct" => |info | {
const ele = try self .element (tag );
defer self .index = ele .slice .end ; // don't force parsing all fields
var res : T = undefined ;
inline for (info .field_names , info .field_types , info .field_attrs ) |f_name , f_type , f_attrs | {
self .field_tag = FieldTag .fromContainer (T , f_name );
if (self .field_tag ) |ft | {
if (ft .explicit ) {
const seq = try self .element (ft .toTag ().toExpected ());
self .index = seq .slice .start ;
self .field_tag = null ;
}
}
@field (res , f_name ) = self .any (f_type ) catch |err | brk : {
if (f_attrs .defaultValue (f_type )) |d | {
break :brk d ;
}
return err ;
};
// DER encodes null values by skipping them.
if (@typeInfo (f_type ) == .optional and @field (res , f_name ) == null ) {
if (f_attrs .defaultValue (f_type )) |d | @field (res , f_name ) = d ;
}
}
return res ;
},
.bool => {
const ele = try self .element (tag );
const bytes = self .view (ele );
if (bytes .len != 1 ) return error .InvalidBool ;
return switch (bytes [0 ]) {
0x00 => false ,
0xff => true ,
else => error .InvalidBool ,
};
},
.int => {
const ele = try self .element (tag );
const bytes = self .view (ele );
return try int (T , bytes );
},
.@"enum" => |e | {
const ele = try self .element (tag );
const bytes = self .view (ele );
if (@hasDecl (T , "oids" )) {
return T .oids .oidToEnum (bytes ) orelse return error .UnknownOid ;
}
return @fromBackingInt (@intCast (try int (e .tag_type , bytes )));
},
.optional => |o | return self .any (o .child ) catch return null ,
else => @compileError ("cannot decode type " ++ @typeName (T )),
}
}
Expect a value.