From 8de29b7e480418d91d4dce17f81fdd64a5902d69 Mon Sep 17 00:00:00 2001 From: ZZZank <3410764033@qq.com> Date: Mon, 3 Jun 2024 18:59:43 +0800 Subject: [PATCH] TypeObject --- .../document/type/DocTypeResolver.java | 6 +-- .../com/probejs/document/type/TypeObject.java | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/probejs/document/type/TypeObject.java diff --git a/src/main/java/com/probejs/document/type/DocTypeResolver.java b/src/main/java/com/probejs/document/type/DocTypeResolver.java index af672ebc..682938e4 100644 --- a/src/main/java/com/probejs/document/type/DocTypeResolver.java +++ b/src/main/java/com/probejs/document/type/DocTypeResolver.java @@ -45,10 +45,8 @@ public static DocType resolve(String type) { return new TypeTuple(type); } - //TODO: Resolve object type - if (type.startsWith("{")) { - // {[x in string]: string} - return new TypeLiteral(type); + if (TypeObject.test(type)) { + return new TypeObject(type); } val splitUnion = StringUtil.splitFirst(type, "|"); diff --git a/src/main/java/com/probejs/document/type/TypeObject.java b/src/main/java/com/probejs/document/type/TypeObject.java new file mode 100644 index 00000000..5c13fc29 --- /dev/null +++ b/src/main/java/com/probejs/document/type/TypeObject.java @@ -0,0 +1,48 @@ +package com.probejs.document.type; + +import com.probejs.util.StringUtil; +import lombok.AllArgsConstructor; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiFunction; +import java.util.stream.Collectors; + +/** + * {@code {value: number, mapping: Map, [x in string]: string}} + * @author ZZZank + */ +@AllArgsConstructor +public class TypeObject implements DocType { + + public static boolean test(String type) { + return type.startsWith("{") && type.endsWith("}"); + } + + private final Map raw; + + public TypeObject(String typeStr) { + if (!test(typeStr)) { + throw new IllegalArgumentException(); + } + this.raw = new HashMap<>(); + StringUtil.splitLayer(typeStr, ",") + .stream() + .map(String::trim) + .map(s -> StringUtil.splitFirst(s, ":")) + .forEach(p -> raw.put(p.first().trim(), DocTypeResolver.resolve(p.second()))); + } + + @Override + public String getTypeName() { + return transform(dummyTransformer); + } + + @Override + public String transform(BiFunction transformer) { + return "{" + raw.entrySet() + .stream() + .map(entry -> String.format("%s: %s", entry.getKey(), entry.getValue().transform(transformer))) + .collect(Collectors.joining(", ")) + "}"; + } +}