|
@@ -5,7 +5,7 @@ namespace Invercargill {
|
|
|
public delegate Tout PropertyGetterTransformer<Tin, Tout>(Tin object);
|
|
|
public delegate Tout PropertySetterTransformer<Tin, Tout>(Tin object) throws Error;
|
|
|
public delegate T ObjectConstructor<T>();
|
|
|
- public class PropertyMapper<T> {
|
|
|
+ public class PropertyMapper<T> : Mapper<T, Properties> {
|
|
|
|
|
|
private Vector<PropertyMapping<T>> mappings;
|
|
|
private ObjectConstructor<T> constructor;
|
|
@@ -37,13 +37,13 @@ namespace Invercargill {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public T materialise(Properties properties) throws Error {
|
|
|
+ public override T materialise(Properties properties) throws Error {
|
|
|
var obj = constructor();
|
|
|
map_into(obj, properties);
|
|
|
return obj;
|
|
|
}
|
|
|
|
|
|
- public Properties map_from(T object) {
|
|
|
+ public override Properties map_from(T object) {
|
|
|
var properties = new PropertiesDictionary();
|
|
|
foreach (var mapping in mappings) {
|
|
|
var val = mapping.getter(object);
|
|
@@ -94,11 +94,15 @@ namespace Invercargill {
|
|
|
}
|
|
|
|
|
|
public PropertyMapperBuilder<T> map_with<TObj>(string name, owned PropertyGetter<T, TObj> getter, owned PropertySetter<T, TObj> setter, PropertyMapper<TObj> mapper, bool mandatory = true) {
|
|
|
+ return map_through<TObj, Properties>(name, getter, setter, mapper, mandatory);
|
|
|
+ }
|
|
|
+
|
|
|
+ public PropertyMapperBuilder<T> map_through<TNative, TElement>(string name, owned PropertyGetter<T, TNative> getter, owned PropertySetter<T, TNative> setter, Mapper<TNative, TElement> mapper, bool mandatory = true) {
|
|
|
add_mapping(new PropertyMapping<T>() {
|
|
|
name = name,
|
|
|
mandatory = mandatory,
|
|
|
- getter = (o) => new NativeElement<Properties>(mapper.map_from(getter(o))),
|
|
|
- setter = (o,d) => setter(o, mapper.materialise(d.as<Properties>()))
|
|
|
+ getter = (o) => new NativeElement<TElement>(mapper.map_from(getter(o))),
|
|
|
+ setter = (o,d) => setter(o, mapper.materialise(d.as<TElement>()))
|
|
|
});
|
|
|
return this;
|
|
|
}
|
|
@@ -114,13 +118,17 @@ namespace Invercargill {
|
|
|
}
|
|
|
|
|
|
public PropertyMapperBuilder<T> map_many_with<TObj>(string name, owned PropertyGetter<T, Enumerable<TObj>> getter, owned PropertySetter<T, Enumerable<TObj>> setter, PropertyMapper<TObj> mapper, bool mandatory = true) {
|
|
|
+ return map_many_through<TObj, Properties>(name, getter, setter, mapper, mandatory);
|
|
|
+ }
|
|
|
+
|
|
|
+ public PropertyMapperBuilder<T> map_many_through<TNative, TElement>(string name, owned PropertyGetter<T, Enumerable<TNative>> getter, owned PropertySetter<T, Enumerable<TNative>> setter, Mapper<TNative, TElement> mapper, bool mandatory = true) {
|
|
|
add_mapping(new PropertyMapping<T>() {
|
|
|
name = name,
|
|
|
mandatory = mandatory,
|
|
|
- getter = (o) => new NativeElement<Elements>(getter(o).select<Properties>(i => mapper.map_from(i)).to_elements()),
|
|
|
+ getter = (o) => new NativeElement<Elements>(getter(o).select<TElement>(i => mapper.map_from(i)).to_elements()),
|
|
|
setter = (o,d) => {
|
|
|
- var collection = new Series<TObj>();
|
|
|
- foreach (var properties in d.as<Elements>().elements_as<Properties>()) {
|
|
|
+ var collection = new Series<TNative>();
|
|
|
+ foreach (var properties in d.as<Elements>().elements_as<TElement>()) {
|
|
|
collection.add(mapper.materialise(properties));
|
|
|
}
|
|
|
setter(o, collection.seal());
|