Use comptime for fully declarative LV2 and Custom commands #14

Merged
luna merged 69 commits from declarative-commands into master 2020-06-02 21:37:47 +00:00
Showing only changes of commit 7f008db540 - Show all commits

View file

@ -1,6 +1,13 @@
const langs = @import("lang.zig"); const langs = @import("lang.zig");
pub fn printCommand(cmd: langs.Command, comptime tag: langs.Command.Tag) !void { fn printCommandWithParams(stream: var, command: var) !void {
const Parameters = @TypeOf(command.parameters);
inline for (@typeInfo(Parameters).Struct.fields) |field| {
try stream.print(" {}", .{@field(command.parameters, field.name)});
}
}
fn printCommand(stream: var, cmd: *langs.Command, comptime tag: langs.Command.Tag) !void {
const CommandStruct = langs.Command.tagToType(tag); const CommandStruct = langs.Command.tagToType(tag);
const casted = cmd.cast(CommandStruct).?; const casted = cmd.cast(CommandStruct).?;
@ -10,10 +17,10 @@ pub fn printCommand(cmd: langs.Command, comptime tag: langs.Command.Tag) !void {
else => true, else => true,
}; };
const ctype = typ.command_type; const ctype = CommandStruct.command_type;
switch (ctype) { switch (ctype) {
.lv2_command => try printLV2Command(casted), .lv2_command => try printCommandWithParams(stream, casted),
.custom_command => try printCustomCommand(casted), .custom_command => try printCommandWithParams(stream, casted),
else => @panic("TODO support command type"), else => @panic("TODO support command type"),
} }
} }
@ -25,48 +32,52 @@ pub fn printList(list: langs.CommandList, stream: var) !void {
switch (cmd.tag) { switch (cmd.tag) {
.load => { .load => {
const load = command.cast(langs.Command.Load).?; const load = cmd.cast(langs.Command.Load).?;
try stream.print(" {}", .{load.path}); try stream.print(" {}", .{load.path});
}, },
.quicksave => {}, .runqs => {
const runqs = cmd.cast(langs.Command.RunQS).?;
try stream.print(" {}", .{runqs.program});
},
.noop, .quicksave => {},
.rotate => { .rotate => {
const rotate = command.cast(langs.Command.Rotate).?; const rotate = cmd.cast(langs.Command.Rotate).?;
try stream.print(" {} {}", .{ rotate.deg, rotate.bgfill }); try stream.print(" {} {}", .{ rotate.deg, rotate.bgfill });
}, },
.amp => try printCommand(cmd, .amp), .amp => try printCommand(stream, cmd, .amp),
.rflanger => try printCommand(cmd, .rflanger), .rflanger => try printCommand(stream, cmd, .rflanger),
.eq => try printCommand(cmd, .eq), .eq => try printCommand(stream, cmd, .eq),
.phaser => try printCommand(cmd, .phaser), .phaser => try printCommand(stream, cmd, .phaser),
.mbeq => try printCommand(cmd, .mbeq), .mbeq => try printCommand(stream, cmd, .mbeq),
.chorus => try printCommand(cmd, .chorus), .chorus => try printCommand(stream, cmd, .chorus),
.pitchscaler => try printCommand(cmd, .pitchscaler), .pitchscaler => try printCommand(stream, cmd, .pitchscaler),
.reverb => try printCommand(cmd, .reverb), .reverb => try printCommand(stream, cmd, .reverb),
.highpass => try printCommand(cmd, .highpass), .highpass => try printCommand(stream, cmd, .highpass),
.delay => try printCommand(cmd, .delay), .delay => try printCommand(stream, cmd, .delay),
.vinyl => try printCommand(cmd, .vinyl), .vinyl => try printCommand(stream, cmd, .vinyl),
.revdelay => try printCommand(cmd, .revdelay), .revdelay => try printCommand(stream, cmd, .revdelay),
.gate => try printCommand(cmd, .gate), .gate => try printCommand(stream, cmd, .gate),
.detune => try printCommand(cmd, .detune), .detune => try printCommand(stream, cmd, .detune),
.overdrive => try printCommand(cmd, .overdrive), .overdrive => try printCommand(stream, cmd, .overdrive),
.degrade => try printCommand(cmd, .degrade), .degrade => try printCommand(stream, cmd, .degrade),
.repsycho => try printCommand(cmd, .repsycho), .repsycho => try printCommand(stream, cmd, .repsycho),
.talkbox => try printCommand(cmd, .talkbox), .talkbox => try printCommand(stream, cmd, .talkbox),
.dyncomp => try printCommand(cmd, .dyncomp), .dyncomp => try printCommand(stream, cmd, .dyncomp),
.thruzero => try printCommand(cmd, .thruzero), .thruzero => try printCommand(stream, cmd, .thruzero),
.foverdrive => try printCommand(cmd, .foverdrive), .foverdrive => try printCommand(stream, cmd, .foverdrive),
.gverb => try printCommand(cmd, .gverb), .gverb => try printCommand(stream, cmd, .gverb),
.invert => try printCommand(cmd, .invert), .invert => try printCommand(stream, cmd, .invert),
.tapedelay => try printCommand(cmd, .tapedelay), .tapedelay => try printCommand(stream, cmd, .tapedelay),
.moddelay => try printCommand(cmd, .moddelay), .moddelay => try printCommand(stream, cmd, .moddelay),
.multichorus => try printCommand(cmd, .multichorus), .multichorus => try printCommand(stream, cmd, .multichorus),
.saturator => try printCommand(cmd, .saturator), .saturator => try printCommand(stream, cmd, .saturator),
.vintagedelay => try printCommand(cmd, .vintagedelay), .vintagedelay => try printCommand(stream, cmd, .vintagedelay),
.noise => try printCommand(cmd, .noise), .noise => try printCommand(stream, cmd, .noise),
.wildnoise => try printCommand(cmd, .wildnoise), .wildnoise => try printCommand(stream, cmd, .wildnoise),
.write => try printCommand(cmd, .write), .write => try printCommand(stream, cmd, .write),
.embed => try printCommand(cmd, .embed), .embed => try printCommand(stream, cmd, .embed),
} }
_ = try stream.write(";\n"); _ = try stream.write(";\n");