summaryrefslogtreecommitdiff
path: root/BJC-Utils2/src/main/java/bjc/utils/cli/fds/MacroFDSMode.java
blob: 2576ee5c80082bb7a73913067f25f2b00009d508 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
package bjc.utils.cli.fds;

import bjc.utils.ioutils.Block;

import java.util.List;
import java.util.Map;
import java.util.function.Consumer;

/**
 * A implementation of FDS mode that invokes macros bound into a map.
 * 
 * @author EVE
 *
 * @param <S>
 *                The FDS state type.
 */
public class MacroFDSMode<S> implements FDSMode<S> {
	private final class MacroFDSCommand implements FDSCommand<S> {
		private String macroName;

		public MacroFDSCommand(String c) {
			macroName = c;
		}

		@Override
		public void run(FDSState<S> state) {
			macros.get(macroName).forEach(dest);
		}
	}

	/*
	 * The available macros.
	 */
	private Map<String, List<Block>> macros;

	/*
	 * Where to send blocks from macros.
	 */
	private Consumer<Block> dest;

	/**
	 * Create a new FDS mode for macros.
	 * 
	 * @param macros
	 *                The macros to use.
	 * 
	 * @param dest
	 *                The destination for blocks from the macros.
	 */
	public MacroFDSMode(Map<String, List<Block>> macros, Consumer<Block> dest) {
		this.macros = macros;
		this.dest = dest;
	}

	@Override
	public String[] registeredChars() {
		return macros.keySet().toArray(new String[0]);
	}

	@Override
	public boolean hasCommand(String comName) {
		return macros.containsKey(comName);
	}

	@Override
	public boolean hasSubmode(String submodeName) {
		return false;
	}

	@Override
	public FDSCommand<S> getCommand(String comName) throws FDSException {
		return new MacroFDSCommand(comName);
	}

	@Override
	public FDSMode<S> getSubmode(String submodeName) throws FDSException {
		throw new FDSException("Submodes aren't available in macroName modes");
	}
}