@@ -115,64 +115,54 @@ pub const InitOptions = struct {
115115 fallback : ? Filter.Level = null ,
116116 };
117117
118- fn intoFilter (
119- self : FilterOpts ,
120- parse_gpa : std.mem.Allocator ,
118+ pub fn parseEnv (
119+ opts : EnvVarOpts ,
120+ gpa : std.mem.Allocator ,
121121 filter_arena : ? std.mem.Allocator ,
122122 ) TryInitError ! Filter {
123- // we can delay hitting the gpa for parsing the env var as it is likely smaller
124- var fba = std .heap .stackFallback (4096 , parse_gpa );
125- const stack_gpa = fba .get ();
126-
127- // drop all at the end
128- // maybe this is all overkill, dunno
129- var arena_impl : std.heap.ArenaAllocator = .init (stack_gpa );
130- defer arena_impl .deinit ();
131-
132- const arena = arena_impl .allocator ();
133-
134- sw : switch (self ) {
135- .env = > | env | {
136- const env_filters = std .process .getEnvVarOwned (arena , env .name ) catch | err | switch (err ) {
137- error .EnvironmentVariableNotFound = > {
138- if (env .fallback ) | fallback | {
139- continue :sw .{ .level = fallback };
140- } else {
141- return .default ;
142- }
143- },
144- error .InvalidWtf8 = > return TryInitError .InvalidEnvValue ,
145- else = > | e | return e ,
146- };
147- continue :sw .{ .parse = env_filters };
148- },
149- .parse = > | filter_input | return try parseFilter (filter_input , arena , filter_arena ),
150- .level = > | level | return try Builder .singleLevel (filter_arena orelse arena , level ),
151- .filter = > | filter | return filter ,
123+ var builder = Builder .init (gpa );
124+ defer builder .deinit ();
125+
126+ if (! try builder .parseEnvLogErrors (opts .name )) {
127+ if (opts .fallback ) | fallback | {
128+ try builder .addLevel (fallback );
129+ } else {
130+ try builder .addScopeLevel (Filter .default_filter );
131+ }
152132 }
133+
134+ return try if (filter_arena ) | a | builder .buildWithAllocator (a ) else builder .build ();
153135 }
154136
155- fn parseFilter (
156- filter_input : []const u8 ,
157- parse_gpa : std.mem.Allocator ,
137+ pub fn parseConfig (
138+ config : []const u8 ,
139+ gpa : std.mem.Allocator ,
158140 filter_arena : ? std.mem.Allocator ,
159141 ) TryInitError ! Filter {
160- var builder = Builder .init (parse_gpa );
142+ var builder = Builder .init (gpa );
161143 defer builder .deinit ();
162144
163- builder .tryParse (filter_input ) catch | err | switch (err ) {
164- error .BuilderError = > {
165- for (builder .diagnostics ()) | diag | switch (diag ) {
166- .invalid_filter = > | f | {
167- std .debug .print ("Warning: Invalid filter: `{s}`, ignoring it\n " , .{f });
168- },
169- };
170- },
171- else = > | e | return e ,
172- };
145+ try builder .parseLogErrors (config );
173146
174147 return try if (filter_arena ) | a | builder .buildWithAllocator (a ) else builder .build ();
175148 }
149+
150+ pub fn wrapLevel (level : Filter.Level , arena : std.mem.Allocator ) TryInitError ! Filter {
151+ return try Builder .singleLevel (arena , level );
152+ }
153+
154+ fn intoFilter (
155+ self : FilterOpts ,
156+ parse_gpa : std.mem.Allocator ,
157+ filter_arena : ? std.mem.Allocator ,
158+ ) TryInitError ! Filter {
159+ switch (self ) {
160+ .env = > | env | return parseEnv (env , parse_gpa , filter_arena ),
161+ .parse = > | spec | return parseConfig (spec , parse_gpa , filter_arena ),
162+ .level = > | level | return try wrapLevel (level , filter_arena orelse parse_gpa ),
163+ .filter = > | filter | return filter ,
164+ }
165+ }
176166 };
177167
178168 pub const Output = union (enum ) {
0 commit comments