-
Notifications
You must be signed in to change notification settings - Fork 43
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[draft] Generate 'sealed interfaces' for Conjure unions (feature flagged) #1838
base: develop
Are you sure you want to change the base?
Changes from all commits
b0178a7
1b2eb0a
66b96a4
883e899
2564514
77fb53b
5fcd9f5
e1ee2d7
1607e90
670e61e
b392291
789faef
0492f30
9c15575
522c851
294d87b
6bdbc78
97d9773
57cc7f2
64543d0
0de3b6a
5ead7ed
52bec4e
eac1c08
92321ae
38624a7
27970b6
e6d716c
a09a2bd
4c1c04a
d36994f
da38b32
d8c25eb
0dff803
acdd0c0
73d81d6
15e622f
da21fde
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
#!/usr/bin/env bash | ||
export CIRCLECI_TEMPLATE=java-library-oss | ||
export JDK=11 | ||
export JDK=17 |
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,215 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* (c) Copyright 2022 Palantir Technologies Inc. All rights reserved. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* you may not use this file except in compliance with the License. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* You may obtain a copy of the License at | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* http://www.apache.org/licenses/LICENSE-2.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Unless required by applicable law or agreed to in writing, software | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* distributed under the License is distributed on an "AS IS" BASIS, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* See the License for the specific language governing permissions and | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* limitations under the License. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
package com.palantir.conjure.java.types; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.fasterxml.jackson.annotation.JsonAnyGetter; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.fasterxml.jackson.annotation.JsonAnySetter; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.fasterxml.jackson.annotation.JsonCreator; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.fasterxml.jackson.annotation.JsonProperty; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.fasterxml.jackson.annotation.JsonSetter; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.fasterxml.jackson.annotation.JsonSubTypes; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.fasterxml.jackson.annotation.JsonTypeInfo; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.fasterxml.jackson.annotation.JsonTypeName; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.palantir.conjure.java.types.Union2.Bar; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.palantir.conjure.java.types.Union2.Baz; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.palantir.conjure.java.types.Union2.Foo; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.palantir.conjure.java.types.Union2.UnknownVariant; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.palantir.logsafe.Preconditions; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.palantir.logsafe.Safe; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.palantir.logsafe.SafeArg; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.palantir.logsafe.exceptions.SafeIllegalArgumentException; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import java.util.Collections; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import java.util.HashMap; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import java.util.Map; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import javax.annotation.Nonnull; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* This is hand-rolled, I just want to make sure it's compatible. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonTypeInfo( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use = JsonTypeInfo.Id.NAME, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
include = JsonTypeInfo.As.EXISTING_PROPERTY, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
property = "type", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
visible = true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
defaultImpl = UnknownVariant.class) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonSubTypes({@JsonSubTypes.Type(Foo.class), @JsonSubTypes.Type(Bar.class), @JsonSubTypes.Type(Baz.class)}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonIgnoreProperties(ignoreUnknown = true) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public sealed interface Union2 { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sealed interface Known permits Foo, Bar, Baz {} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static Union2 foo(String value) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return new Foo(value); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @deprecated Int is deprecated. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@Deprecated | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static Union2 bar(int value) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return new Bar(value); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* 64-bit integer. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @deprecated Prefer <code>foo</code>. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@Deprecated | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static Union2 baz(long value) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return new Baz(value); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static Union2 unknown(@Safe String type, Object value) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return switch (Preconditions.checkNotNull(type, "Type is required")) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case "foo" -> throw new SafeIllegalArgumentException( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Unknown type cannot be created as the provided type is known: foo"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case "bar" -> throw new SafeIllegalArgumentException( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Unknown type cannot be created as the provided type is known: bar"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case "baz" -> throw new SafeIllegalArgumentException( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Unknown type cannot be created as the provided type is known: baz"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
default -> new UnknownVariant(type, Collections.singletonMap(type, value)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
default Known throwOnUnknown() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (this instanceof UnknownVariant) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new SafeIllegalArgumentException( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Unknown variant of the 'Union' union", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SafeArg.of("unknownType", ((UnknownVariant) this).getType())); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return (Known) this; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonTypeName("foo") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
record Foo(String value) implements Union2, Known { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public Foo(@JsonSetter("foo") @Nonnull String value) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Preconditions.checkNotNull(value, "foo cannot be null"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.value = value; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonProperty(value = "type", index = 0) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@SuppressWarnings("UnusedMethod") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private String getType() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "foo"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonProperty("foo") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public String getValue() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return value; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonTypeName("bar") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
record Bar(int value) implements Union2, Known { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public Bar(@JsonSetter("bar") @Nonnull int value) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Preconditions.checkNotNull(value, "bar cannot be null"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.value = value; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonProperty(value = "type", index = 0) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@SuppressWarnings("UnusedMethod") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private String getType() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "bar"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonProperty("bar") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public int getValue() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return value; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonTypeName("baz") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
record Baz(long value) implements Union2, Known { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public Baz(@JsonSetter("baz") @Nonnull long value) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Preconditions.checkNotNull(value, "baz cannot be null"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.value = value; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonProperty(value = "type", index = 0) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@SuppressWarnings("UnusedMethod") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private String getType() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "baz"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonProperty("baz") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public long getValue() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return value; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+139
to
+157
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Entirely untested, but I wonder if can do something like this:
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Diff didn't render how I expected... The above suggests adding an annotation to the record: |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
final class UnknownVariant implements Union2 { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private final String type; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private final Map<String, Object> value; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private UnknownVariant(@JsonProperty("type") String type) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this(type, new HashMap<String, Object>()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private UnknownVariant(@Nonnull String type, @Nonnull Map<String, Object> value) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Preconditions.checkNotNull(type, "type cannot be null"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Preconditions.checkNotNull(value, "value cannot be null"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.type = type; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.value = value; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonProperty | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@SuppressWarnings("UnusedMethod") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private String getType() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return type; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonAnyGetter | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public Map<String, Object> getValue() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return value; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@SuppressWarnings("UnusedMethod") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@JsonAnySetter | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private void put(String key, Object val) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
value.put(key, val); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@Override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public boolean equals(Object other) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return this == other || (other instanceof UnknownVariant && equalTo((UnknownVariant) other)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private boolean equalTo(UnknownVariant other) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return this.type.equals(other.type) && this.value.equals(other.value); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@Override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public int hashCode() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
int hash = 1; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
hash = 31 * hash + this.type.hashCode(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
hash = 31 * hash + this.value.hashCode(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return hash; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@Override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public String toString() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "UnknownWrapper{type: " + type + ", value: " + value + '}'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Then below we don't need to implement
Union2, Known
, onlyKnown
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Idea here is that we can use
MyUnion.Known
internally for business logic, ensuring that nothing has to validate against unknown variants, but no casting/validation is required to return or passMyUnion.Known
as aMyUnion
.We may be able to do something clever with safety annotations on
MyUnion.Known
that can't be guaranteed on the base type with an unknown variant (some issues today since we don't allow safety to be redefined as safer than a supertype, but I think it's reasonable in this instance, trick is ensuring we know when is safe, and when isn't)