All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.tinkoff.kora.config.common.PathElement Maven / Gradle / Ivy

package ru.tinkoff.kora.config.common;

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;

public sealed interface PathElement {
    static PathElement.Index get(int index) {
        return new Index(index);
    }

    static PathElement.Key get(String key) {
        return new Key(key);
    }

    record Index(int index) implements PathElement {
        @Override
        public String toString() {
            return Integer.toString(index);
        }
    }

    final class Key implements PathElement {
        private final String name;
        private volatile List relaxedNames = null;

        private Key(String name) {
            this.name = name;
        }

        public List relaxedNames() {
            var names = this.relaxedNames;
            if (names != null) {
                return names;
            }
            var parsed = parseRelaxedNames(name);
            this.relaxedNames = parsed;
            return parsed;
        }

        public String name() {
            return this.name;
        }

        @Override
        public String toString() {
            return this.name;
        }

        private static List parseRelaxedNames(String fieldName) {
            var parts = new ArrayList();
            int prevI = 0;
            for (int i = 0; i < fieldName.length(); i++) {
                var hasNext = i + 1 < fieldName.length();
                var hasPrevious = i > 0;
                var c = fieldName.charAt(i);
                var isDigit = Character.isDigit(c);
                var isAlphabetic = Character.isAlphabetic(c);
                var isUppercase = Character.isUpperCase(c);
                var isLowercase = Character.isLowerCase(c);
                if (hasPrevious) {
                    var prev = fieldName.charAt(i - 1);
                    if (isAlphabetic && isUppercase) {
                        if (!Character.isAlphabetic(prev)) {
                            parts.add(fieldName.substring(prevI, i).toLowerCase());
                            prevI = i;
                        } else if (Character.isLowerCase(prev)) {
                            parts.add(fieldName.substring(prevI, i).toLowerCase());
                            prevI = i;
                        } else if (Character.isUpperCase(prev) && hasNext && Character.isLowerCase(fieldName.charAt(i + 1))) {
                            parts.add(fieldName.substring(prevI, i).toLowerCase());
                            prevI = i;
                        }
                    } else if (isAlphabetic && isLowercase) {
                        if (!Character.isAlphabetic(prev)) {
                            parts.add(fieldName.substring(prevI, i).toLowerCase());
                            prevI = i;
                        }
                    } else if (isDigit) {
                        if (!Character.isDigit(prev)) {
                            parts.add(fieldName.substring(prevI, i).toLowerCase());
                            prevI = i;
                        }
                    } else if (!isAlphabetic) {
                        if (Character.isLetterOrDigit(prev)) {
                            parts.add(fieldName.substring(prevI, i).toLowerCase());
                            prevI = i;
                        }
                    }
                }
                if (!hasNext) {
                    parts.add(fieldName.substring(prevI, i + 1).toLowerCase());
                }
            }

            var kebab = String.join("-", parts);
            var snake = String.join("_", parts);

            var set = new LinkedHashSet();
            set.add(fieldName);
            set.add(kebab);
            set.add(snake);
            return new ArrayList<>(set);
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy