Skip to content

Commit 159e2b3

Browse files
committed
add DataStore Builder
1 parent cc88580 commit 159e2b3

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

src/main/java/org/spongepowered/api/data/persistence/DataStore.java

+93
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,26 @@
2525
package org.spongepowered.api.data.persistence;
2626

2727
import com.google.common.reflect.TypeToken;
28+
import org.spongepowered.api.Sponge;
2829
import org.spongepowered.api.data.DataHolder;
2930
import org.spongepowered.api.data.DataManipulator;
31+
import org.spongepowered.api.data.Key;
3032
import org.spongepowered.api.data.value.Value;
33+
import org.spongepowered.api.util.ResettableBuilder;
34+
35+
import java.util.Collection;
36+
import java.util.Map;
37+
import java.util.Optional;
38+
import java.util.function.BiConsumer;
39+
import java.util.function.Function;
3140

3241
public interface DataStore {
3342

43+
/**
44+
* Gets the supported {@link DataHolder} type.
45+
*
46+
* @return The supported dataHolder type.
47+
*/
3448
TypeToken<? extends DataHolder> getSupportedToken();
3549

3650
/**
@@ -97,4 +111,83 @@ default DataManipulator.Mutable deserialize(DataView view) {
97111
return dataManipulator;
98112
}
99113

114+
/**
115+
* Provides a {@link DataStore} for a single {@link Key}.
116+
* <p>
117+
* Note that default deserializers do not support {@link Collection}, {@link Map} or Array types!
118+
* Use {@link Builder#key(Key, BiConsumer, Function)} for these.
119+
* </p>
120+
*
121+
* @param key The data key
122+
* @param dataQuery The dataQuery to serialize this key under
123+
* @param typeToken The dataHolder type
124+
125+
* @return The new data store
126+
*/
127+
static <T> DataStore of(Key<Value<T>> key, DataQuery dataQuery, TypeToken<? extends DataHolder> typeToken) {
128+
return builder().key(key, dataQuery).build(typeToken);
129+
}
130+
131+
/**
132+
* Returns the {@link DataStore} builder.
133+
*
134+
* @return The dataStore builder.
135+
*/
136+
static DataStore.Builder builder() {
137+
return Sponge.getRegistry().getBuilderRegistry().provideBuilder(Builder.class);
138+
}
139+
140+
interface Builder extends ResettableBuilder<DataStore, Builder> {
141+
142+
/**
143+
* Adds the default implemented serializers for the given key.
144+
* <p>
145+
* Note that default deserializers do not support {@link Collection}, {@link Map} or Array types!
146+
* Use {@link #key(Key, BiConsumer, Function)} for these.
147+
* </p>
148+
*
149+
* @param key The data key
150+
* @param dataQueries The dataQuery to serialize this key under
151+
*
152+
* @return this builder for chaining
153+
*/
154+
default <T> Builder key(Key<Value<T>> key, String... dataQueries) {
155+
return this.key(key, DataQuery.of(dataQueries));
156+
}
157+
158+
/**
159+
* Adds the default implemented serializers for the given key.
160+
* <p>
161+
* Note that default deserializers do not support {@link Collection}, {@link Map} or Array types!
162+
* Use {@link #key(Key, BiConsumer, Function)} for these.
163+
* </p>
164+
*
165+
* @param key The data key
166+
* @param dataQuery The dataQuery to serialize this key under
167+
*
168+
* @return this builder for chaining
169+
*/
170+
<T> Builder key(Key<Value<T>> key, DataQuery dataQuery);
171+
172+
/**
173+
* Adds the serializers for the given key.
174+
*
175+
* @param key The data key
176+
* @param serializer the data serializer
177+
* @param deserializer the data serserializer
178+
*
179+
* @return this builder for chaining
180+
*/
181+
<T> Builder key(Key<Value<T>> key, BiConsumer<DataView, T> serializer, Function<DataView, Optional<T>> deserializer);
182+
183+
/**
184+
* Builds a dataStore for given dataHolder type.
185+
*
186+
* @param typeToken The dataHolder type
187+
*
188+
* @return The new data store
189+
*/
190+
DataStore build(TypeToken<? extends DataHolder> typeToken);
191+
}
192+
100193
}

0 commit comments

Comments
 (0)