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}