ConfigEntryContainer.java 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package me.lortseam.completeconfig.api;
  2. import com.google.common.collect.ImmutableList;
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. /**
  10. * A container of config entries.
  11. */
  12. public interface ConfigEntryContainer {
  13. /**
  14. * Used to register other containers. They will be located on the same level.
  15. *
  16. * @return an array of other containers
  17. * @see Transitive
  18. */
  19. default ConfigEntryContainer[] getTransitiveConfigEntryContainers() {
  20. return new ConfigEntryContainer[0];
  21. }
  22. default boolean isConfigPOJO() {
  23. return false;
  24. }
  25. /**
  26. * Applied to declare that a field of type {@link ConfigEntryContainer} is transitive. The container will be
  27. * registered on the same level.
  28. *
  29. * @see #getTransitiveConfigEntryContainers()
  30. */
  31. @Target(ElementType.FIELD)
  32. @Retention(RetentionPolicy.RUNTIME)
  33. @interface Transitive {
  34. }
  35. default List<Class<? extends ConfigEntryContainer>> getClasses() {
  36. List<Class<? extends ConfigEntryContainer>> classes = new ArrayList<>();
  37. Class<? extends ConfigEntryContainer> clazz = getClass();
  38. while (clazz != null) {
  39. classes.add(clazz);
  40. if (!ConfigEntryContainer.class.isAssignableFrom(clazz.getSuperclass())) {
  41. break;
  42. }
  43. clazz = (Class<? extends ConfigEntryContainer>) clazz.getSuperclass();
  44. }
  45. return ImmutableList.copyOf(classes);
  46. }
  47. }