package kaka.cakelight;
-import kaka.cakelight.mode.AmbientMode;
-import kaka.cakelight.mode.SingleColorMode;
-import kaka.cakelight.mode.SunriseMode;
-import kaka.cakelight.mode.TwoColorNoiseMode;
-import kaka.cakelight.mode.VideoMode;
+import kaka.cakelight.mode.*;
import java.util.function.BiFunction;
}
@Override
- public void activate(Console console, String[] args) {
+ public Object activate(Console console, String[] args) {
if (!activate.apply(console, args)) {
console.out("did NOT run command");
}
+ return null;
+ }
+ };
+ }
+
+ private static Console.Command modeCommand(String[] names, BiFunction<Console, String[], Mode> activate) {
+ return new Console.Command() {
+ @Override
+ public String[] getNames() {
+ return names;
+ }
+
+ @Override
+ public Object activate(Console console, String[] args) {
+ Mode mode = activate.apply(console, args);
+ if (mode == null) {
+ console.out("did NOT run command");
+ }
+ return mode;
}
};
}
});
}
- static Console.Command video() {
- return command(new String[] {"v", "video"}, (console, args) -> {
- console.getCakelight().setMode(new VideoMode());
- return true;
+ static Console.Command push() {
+ return command(new String[] {"push"}, (console, args) -> {
+ Object obj = console.handleInput(String.join(" ", args));
+ if (obj instanceof Mode) { // obj could be anything, which should be fixed
+ console.out("pushing mode " + obj.getClass().getSimpleName());
+ console.getCakelight().pushMode((Mode) obj);
+ }
+ return true;
});
}
+ static Console.Command pop() {
+ return command(new String[] {"pop"}, (console, args) -> {
+ console.out("popping mode " + console.getCakelight().popMode().getClass().getSimpleName());
+ return true;
+ });
+ }
+
+ static Console.Command video() {
+ return modeCommand(new String[] {"v", "video"}, (console, args) -> new VideoMode());
+ }
+
static Console.Command color() {
- return command(new String[] {"c", "col", "color"}, (console, args) -> {
+ return modeCommand(new String[] {"c", "col", "color"}, (console, args) -> {
Color c = null;
if (args.length == 1) {
c = console.parseColor(args[0]);
);
}
if (c != null) {
- console.getCakelight().setMode(new SingleColorMode(c));
console.out("setting color to " + c);
- return true;
- } else {
- return false;
+ return new SingleColorMode(c);
}
+ return null;
});
}
}
static Console.Command ambientMode() {
- return command(new String[] {"m", "mode"}, (console, args) -> {
+ return modeCommand(new String[] {"m", "mode"}, (console, args) -> {
if (args.length == 1) {
- console.getCakelight().setMode(new AmbientMode(new String[] {args[0]}));
console.out("setting ambient mode to " + args[0]);
- return true;
- } else {
- return false;
+ return new AmbientMode(new String[]{args[0]});
}
+ return null;
});
}
static Console.Command twoColorNoiseMode() {
- return command(new String[] {"n", "noise"}, (console, args) -> {
+ return modeCommand(new String[] {"n", "noise"}, (console, args) -> {
if (args.length == 2) {
- console.getCakelight().setMode(new TwoColorNoiseMode(
+ console.out("setting two-color noise mode");
+ return new TwoColorNoiseMode(
console.parseColor(args[0]),
console.parseColor(args[1])
- ));
- console.out("setting two-color noise mode");
- return true;
- } else {
- return false;
+ );
}
+ return null;
});
}
static Console.Command sunriseMode() {
- return command(new String[] {"sunrise"}, (console, args) -> {
+ return modeCommand(new String[] {"sunrise"}, (console, args) -> {
if (args.length == 1) {
int durationSeconds = Integer.parseInt(args[0]);
- console.getCakelight().setMode(new SunriseMode(durationSeconds));
console.out("setting sunrise mode with duration " + durationSeconds);
- return true;
- } else {
- return false;
+ return new SunriseMode(durationSeconds);
}
+ return null;
});
}
}
package kaka.cakelight;
+import kaka.cakelight.mode.Mode;
+
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
this.config = config;
register(Commands.help());
register(Commands.quit());
+ register(Commands.push());
+ register(Commands.pop());
register(Commands.video());
register(Commands.color());
register(Commands.brightness());
while (running) {
System.out.print("> ");
String input = reader.readLine();
- handleInput(input);
+ internalHandleInput(input);
}
} catch (IOException e) {
System.out.println("Error reading from command line");
}
}
- void handleInput(String input) {
+ private void internalHandleInput(String input) {
+ Object obj = handleInput(input);
+ if (obj instanceof Mode) {
+ cakelight.setMode((Mode) obj);
+ }
+ }
+
+ Object handleInput(String input) {
String[] splitInput = input.split("\\s+", 2);
String name = splitInput[0];
String[] args = splitInput.length == 2
Command cmd = commands.get(name);
if (cmd != null) {
- cmd.activate(this, args);
+ return cmd.activate(this, args);
} else {
out("no command named '" + name + "'");
}
+ return null;
}
void out(String text) {
public interface Command {
String[] getNames();
- void activate(Console console, String[] args);
+ Object activate(Console console, String[] args);
}
}