69 lines
2.1 KiB
Java
69 lines
2.1 KiB
Java
package ch.fritteli.maze.generator.renderer.jsonfile;
|
|
|
|
import ch.fritteli.maze.generator.model.Maze;
|
|
import ch.fritteli.maze.generator.renderer.Renderer;
|
|
import ch.fritteli.maze.generator.renderer.json.JsonRenderer;
|
|
import io.vavr.control.Option;
|
|
import io.vavr.control.Try;
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
import java.util.NoSuchElementException;
|
|
import lombok.NonNull;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
@Slf4j
|
|
public class JsonFileRenderer implements Renderer<Path> {
|
|
|
|
@NonNull
|
|
private static final JsonRenderer JSON_RENDERER = JsonRenderer.newInstance();
|
|
@NonNull
|
|
private Option<Path> targetFile;
|
|
|
|
private JsonFileRenderer() {
|
|
this.targetFile = Try
|
|
.of(() -> Files.createTempFile("maze_", ".json"))
|
|
.onFailure(ex -> log.error("Unable to set default target file.", ex))
|
|
.toOption();
|
|
}
|
|
|
|
@NonNull
|
|
public static JsonFileRenderer newInstance() {
|
|
return new JsonFileRenderer();
|
|
}
|
|
|
|
public boolean isTargetFileDefinedAndWritable() {
|
|
return this.targetFile
|
|
.map(Path::toFile)
|
|
.exists(File::canWrite);
|
|
}
|
|
|
|
@NonNull
|
|
public JsonFileRenderer setTargetFile(@NonNull final Path targetFile) {
|
|
this.targetFile = Option.of(targetFile);
|
|
return this;
|
|
}
|
|
|
|
@NonNull
|
|
@Override
|
|
public Path render(@NonNull final Maze maze) {
|
|
if (!this.isTargetFileDefinedAndWritable()) {
|
|
try {
|
|
Files.createFile(this.targetFile.get());
|
|
} catch (final IOException | NoSuchElementException e) {
|
|
throw new IllegalArgumentException("Cannot write to target file.", e);
|
|
}
|
|
}
|
|
final String json = JSON_RENDERER.render(maze);
|
|
final Path outputFile = this.targetFile.get();
|
|
try {
|
|
Files.writeString(outputFile, json, StandardCharsets.UTF_8);
|
|
} catch (final IOException e) {
|
|
log.error("Failed writing to file %s".formatted(outputFile.normalize()), e);
|
|
}
|
|
return outputFile;
|
|
}
|
|
}
|