A configuration system made for Fabric
In both examples we define a custom ConfigType for FiberId (a generic Identifier) like this:
StringConfigType<FiberId> FIBER_ID = ConfigTypes.STRING.derive( FiberId.class, s -> new FiberId(s.substring(0, s.indexOf(':')), s.substring(s.indexOf(':') + 1)), FiberId::toString );Creating the immediate representation of your configuration using builders:
// Constructing the immediate representation PropertyMirror<FiberId> someIdentifier = PropertyMirror.create(FIBER_ID); ConfigTree tree = ConfigTree.builder() .beginValue("some_identifier", FIBER_ID, new FiberId("some", "identifier")) .withComment("This is a comment attached to some_identifier!") .finishValue(someIdentifier::mirror) .fork("gui") .withValue("opacity", ConfigTypes.FLOAT.withValidRange(0, 1, 0.1), 1f) .finishBranch() .build(); // Interacting with the configuration System.out.println(someIdentifier.getValue());Create a class representing the configuration:
@Settings(namingConvention = SnakeCaseConvention.class) private static class MyPojo { FiberId someIdentifier = new FiberId("some", "identifier"); @Setting.Group GuiGroup gui = new GuiGroup(); private static class GuiGroup { public @Setting.Constrain.Range(min = 0, max = 1, step = 0.1) float opacity = 1f; } }And to turn it into an immediate representation:
// Registering the custom type to the annotation processor AnnotatedSettings settings = AnnotatedSettings.create(); settings.registerTypeMapping(FiberId.class, FIBER_ID); // Creating the immediate representation from the annotated POJO MyPojo pojo = new MyPojo(); ConfigTree tree = ConfigTree.builder().applyFromPojo(pojo, settings).build(); System.out.println(pojo.someIdentifier);Add the following to your dependencies (build.gradle):
dependencies { ... implementation "me.zeroeightsix:fiber:${project.fiber_version}" }Add fiber_version to your gradle.properties:
fiber_version = <VERSION HERE>Replace <VERSION HERE> with the latest version of fiber, which you can find here.
If you're using fiber in a project without fabric, you may have to add the repository as well:
repositories { maven { url = "https://maven.modmuss50.me/" } }