diff --git a/src/main/java/net/rubygrapefruit/platform/Main.java b/src/main/java/net/rubygrapefruit/platform/Main.java index 48f3b30..bfadfc1 100644 --- a/src/main/java/net/rubygrapefruit/platform/Main.java +++ b/src/main/java/net/rubygrapefruit/platform/Main.java @@ -1,20 +1,19 @@ package net.rubygrapefruit.platform; -import java.awt.*; - public class Main { public static void main(String[] args) { Process process = Platform.get(Process.class); System.out.println("* PID: " + process.getPid()); - Terminal terminal = Platform.get(Terminal.class); + TerminalAccess terminalAccess = Platform.get(TerminalAccess.class); - boolean stdoutIsTerminal = terminal.isTerminal(Terminal.Output.Stdout); - boolean stderrIsTerminal = terminal.isTerminal(Terminal.Output.Stderr); + boolean stdoutIsTerminal = terminalAccess.isTerminal(TerminalAccess.Output.Stdout); + boolean stderrIsTerminal = terminalAccess.isTerminal(TerminalAccess.Output.Stderr); System.out.println("* stdout: " + (stdoutIsTerminal ? "terminal" : "not a terminal")); System.out.println("* stderr: " + (stderrIsTerminal ? "terminal" : "not a terminal")); if (stdoutIsTerminal) { - TerminalSize terminalSize = terminal.getTerminalSize(Terminal.Output.Stdout); + Terminal terminal = terminalAccess.getTerminal(TerminalAccess.Output.Stdout); + TerminalSize terminalSize = terminal.getTerminalSize(); System.out.println("* terminal size: " + terminalSize.getCols() + " cols x " + terminalSize.getRows() + " rows"); } } diff --git a/src/main/java/net/rubygrapefruit/platform/Platform.java b/src/main/java/net/rubygrapefruit/platform/Platform.java index eac7066..c588354 100644 --- a/src/main/java/net/rubygrapefruit/platform/Platform.java +++ b/src/main/java/net/rubygrapefruit/platform/Platform.java @@ -34,8 +34,8 @@ public class Platform { if (type.equals(Process.class)) { return type.cast(new DefaultProcess()); } - if (type.equals(Terminal.class)) { - return type.cast(new DefaultTerminal()); + if (type.equals(TerminalAccess.class)) { + return type.cast(new DefaultTerminalAccess()); } throw new UnsupportedOperationException(String.format("Cannot load unknown native integration %s.", type.getName())); @@ -70,19 +70,36 @@ public class Platform { } } - private static class DefaultTerminal implements Terminal { + private static class DefaultTerminalAccess implements TerminalAccess { @Override public boolean isTerminal(Output output) { return PosixTerminalFunctions.isatty(output.ordinal()); } @Override - public TerminalSize getTerminalSize(Output output) { + public Terminal getTerminal(Output output) { + if (!isTerminal(output)) { + throw new NativeException(String.format("%s is not attached to a terminal.", output)); + } + return new DefaultTerminal(output); + } + } + + private static class DefaultTerminal implements Terminal { + private final TerminalAccess.Output output; + + public DefaultTerminal(TerminalAccess.Output output) { + this.output = output; + } + + @Override + public TerminalSize getTerminalSize() { MutableTerminalSize terminalSize = new MutableTerminalSize(); FunctionResult result = new FunctionResult(); PosixTerminalFunctions.getTerminalSize(output.ordinal(), terminalSize, result); if (result.isFailed()) { - throw new NativeException(String.format("Could not get terminal size. Errno is %d.", result.getErrno())); + throw new NativeException(String.format("Could not get terminal size. Errno is %d.", + result.getErrno())); } return terminalSize; } diff --git a/src/main/java/net/rubygrapefruit/platform/Terminal.java b/src/main/java/net/rubygrapefruit/platform/Terminal.java index 2adf593..3567647 100644 --- a/src/main/java/net/rubygrapefruit/platform/Terminal.java +++ b/src/main/java/net/rubygrapefruit/platform/Terminal.java @@ -1,9 +1,5 @@ package net.rubygrapefruit.platform; -public interface Terminal extends NativeIntegration { - enum Output {Stdout, Stderr} - - boolean isTerminal(Output output); - - TerminalSize getTerminalSize(Output output); +public interface Terminal { + TerminalSize getTerminalSize(); } diff --git a/src/main/java/net/rubygrapefruit/platform/TerminalAccess.java b/src/main/java/net/rubygrapefruit/platform/TerminalAccess.java new file mode 100644 index 0000000..cd60f41 --- /dev/null +++ b/src/main/java/net/rubygrapefruit/platform/TerminalAccess.java @@ -0,0 +1,9 @@ +package net.rubygrapefruit.platform; + +public interface TerminalAccess extends NativeIntegration { + enum Output {Stdout, Stderr} + + boolean isTerminal(Output output); + + Terminal getTerminal(Output output); +} diff --git a/src/test/groovy/net/rubygrapefruit/platform/TerminalTest.groovy b/src/test/groovy/net/rubygrapefruit/platform/TerminalTest.groovy index 5cc7b8d..972b7fd 100644 --- a/src/test/groovy/net/rubygrapefruit/platform/TerminalTest.groovy +++ b/src/test/groovy/net/rubygrapefruit/platform/TerminalTest.groovy @@ -6,20 +6,20 @@ import spock.lang.Specification class TerminalTest extends Specification { @Rule TemporaryFolder tmpDir - final Terminal terminal = Platform.get(Terminal.class) + final TerminalAccess terminal = Platform.get(TerminalAccess.class) def "can check if attached to terminal"() { expect: - !terminal.isTerminal(Terminal.Output.Stdout); - !terminal.isTerminal(Terminal.Output.Stderr); + !terminal.isTerminal(TerminalAccess.Output.Stdout); + !terminal.isTerminal(TerminalAccess.Output.Stderr); } def "cannot determine terminal size from a test"() { when: - terminal.getTerminalSize(Terminal.Output.Stdout) + terminal.getTerminal(TerminalAccess.Output.Stdout) then: NativeException e = thrown() - e.message.startsWith('Could not get terminal size. Errno is ') + e.message.startsWith('Stdout is not attached to a terminal.') } }