001package net.filebot.format;
002
003import static net.filebot.Logging.*;
004
005import java.util.Collection;
006import java.util.function.Function;
007import java.util.function.Supplier;
008
009import groovy.lang.GroovyObjectSupport;
010
011public class DynamicBindings extends GroovyObjectSupport {
012
013        private final Supplier<Collection<?>> keys;
014        private final Get<String, Object> properties;
015        private final Function<Object, Object> normalize;
016
017        public DynamicBindings(Supplier<Collection<?>> keys, Get<String, Object> properties) {
018                this(keys, properties, Function.identity());
019        }
020
021        private DynamicBindings(Supplier<Collection<?>> keys, Get<String, Object> properties, Function<Object, Object> normalize) {
022                this.keys = keys;
023                this.properties = properties;
024                this.normalize = normalize;
025        }
026
027        public DynamicBindings normalize(Function<Object, Object> normalize) {
028                return new DynamicBindings(keys, properties, normalize);
029        }
030
031        public Object getAt(Object key) {
032                return getProperty(key.toString());
033        }
034
035        @Override
036        public Object getProperty(String property) {
037                try {
038                        return normalize.apply(properties.get(property));
039                } catch (BindingException e) {
040                        throw e;
041                } catch (Exception e) {
042                        throw new BindingException(property, cause(e), e, BindingException.Flag.UNDEFINED);
043                }
044        }
045
046        @Override
047        public String toString() {
048                return keys.get().toString();
049        }
050
051        @FunctionalInterface
052        public interface Get<T, R> {
053                R get(T t) throws Exception;
054        }
055
056}