@@ -74,8 +74,15 @@ pub const Kv = struct {
74
74
pub fn ctx (self : * Kv , value : []const u8 ) void {
75
75
if (! self .writeKeyForValue ("@ctx" , value .len )) return ;
76
76
const pos = self .pos ;
77
- @memcpy (self .buf [pos .. pos + value .len ], value );
78
- self .pos = pos + value .len ;
77
+ const end = pos + value .len ;
78
+ @memcpy (self .buf [pos .. end ], value );
79
+ self .pos = end ;
80
+ }
81
+
82
+ pub fn src (self : * Kv , value : std.builtin.SourceLocation ) void {
83
+ self .string ("@src.file" , value .file );
84
+ self .string ("@src.fn" , value .fn_name );
85
+ self .int ("@src.line" , value .line );
79
86
}
80
87
81
88
pub fn string (self : * Kv , key : []const u8 , nvalue : ? []const u8 ) void {
@@ -103,8 +110,9 @@ pub const Kv = struct {
103
110
}
104
111
105
112
if (! needs_escape ) {
106
- @memcpy (self .buf [pos .. pos + value .len ], value );
107
- self .pos = pos + value .len ;
113
+ const end = pos + value .len ;
114
+ @memcpy (self .buf [pos .. end ], value );
115
+ self .pos = end ;
108
116
return ;
109
117
}
110
118
@@ -164,8 +172,9 @@ pub const Kv = struct {
164
172
if (value ) | v | {
165
173
if (! self .writeKeyForValue (key , v .len )) return ;
166
174
const pos = self .pos ;
167
- @memcpy (self .buf [pos .. pos + v .len ], v );
168
- self .pos = pos + v .len ;
175
+ const end = pos + v .len ;
176
+ @memcpy (self .buf [pos .. end ], v );
177
+ self .pos = end ;
169
178
} else {
170
179
self .writeNull (key );
171
180
}
@@ -386,8 +395,9 @@ pub const Kv = struct {
386
395
pos += 1 ;
387
396
}
388
397
389
- @memcpy (buf [pos .. pos + key .len ], key );
390
- pos += key .len ;
398
+ const end = pos + key .len ;
399
+ @memcpy (buf [pos .. end ], key );
400
+ pos = end ;
391
401
buf [pos ] = '=' ;
392
402
self .pos = pos + 1 ;
393
403
return true ;
@@ -1047,6 +1057,25 @@ test "kv: ctx" {
1047
1057
}
1048
1058
}
1049
1059
1060
+ test "kv: src" {
1061
+ var pool = try Pool .init (t .allocator , .{.pool_size = 1 });
1062
+ defer pool .deinit ();
1063
+
1064
+ var out = std .ArrayList (u8 ).init (t .allocator );
1065
+ try out .ensureTotalCapacity (100 );
1066
+ defer out .deinit ();
1067
+
1068
+ {
1069
+ // normal strings
1070
+ var kv = pool .acquire () orelse unreachable ;
1071
+ defer pool .release (kv );
1072
+
1073
+ kv .src (@src ());
1074
+ try kv .logTo (out .writer ());
1075
+ try t .expectString (out .items , "@ts=9999999999999 @src.file=src/kv.zig @src.fn=\" test.kv: src\" @src.line=1073\n " );
1076
+ }
1077
+ }
1078
+
1050
1079
test "kv: fmt" {
1051
1080
var pool = try Pool .init (t .allocator , .{.pool_size = 1 });
1052
1081
defer pool .deinit ();
0 commit comments