diff --git a/core/src/main/java/me/ivovk/connect_rpc_java/core/http/Paths.java b/core/src/main/java/me/ivovk/connect_rpc_java/core/http/Paths.java index a6ce6fb..bc45ecc 100644 --- a/core/src/main/java/me/ivovk/connect_rpc_java/core/http/Paths.java +++ b/core/src/main/java/me/ivovk/connect_rpc_java/core/http/Paths.java @@ -36,8 +36,8 @@ public int hashCode() { } } - public static Optional extractPathSegments(String path) { - return extractPathSegments(path, Path.ROOT_PATH); + public static Path extractPathSegments(String path) { + return extractPathSegments(path, Path.ROOT_PATH).get(); } public static Optional extractPathSegments(String path, Path prefix) { diff --git a/core/src/main/java/me/ivovk/connect_rpc_java/core/transcoding/TranscodingUrlMatcher.java b/core/src/main/java/me/ivovk/connect_rpc_java/core/transcoding/TranscodingUrlMatcher.java new file mode 100644 index 0000000..437c059 --- /dev/null +++ b/core/src/main/java/me/ivovk/connect_rpc_java/core/transcoding/TranscodingUrlMatcher.java @@ -0,0 +1,65 @@ +package me.ivovk.connect_rpc_java.core.transcoding; + +import com.google.api.HttpRule; +import me.ivovk.connect_rpc_java.core.grpc.MethodRegistry; +import me.ivovk.connect_rpc_java.core.http.Paths; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +public class TranscodingUrlMatcher { + + public static TranscodingUrlMatcher create( + List methods, Paths.Path pathPrefix) { + methods.stream() + .flatMap(method -> method.httpRule().stream()) + .flatMap( + httpRule -> { + var additionalBindings = httpRule.getAdditionalBindingsList(); + + return Stream.concat(Stream.of(httpRule), additionalBindings.stream()) + .map( + rule -> { + var methodAndPattern = extractMethodAndPattern(rule); + + return null; + }); + }); + + return null; + } + + record MethodAndPattern(Optional method, Paths.Path path) {} + + private static MethodAndPattern extractMethodAndPattern(HttpRule rule) { + switch (rule.getPatternCase()) { + case GET -> { + return new MethodAndPattern( + Optional.of(HttpRule.PatternCase.GET), Paths.extractPathSegments(rule.getGet())); + } + case PUT -> { + return new MethodAndPattern( + Optional.of(HttpRule.PatternCase.PUT), Paths.extractPathSegments(rule.getPut())); + } + case POST -> { + return new MethodAndPattern( + Optional.of(HttpRule.PatternCase.POST), Paths.extractPathSegments(rule.getPost())); + } + case DELETE -> { + return new MethodAndPattern( + Optional.of(HttpRule.PatternCase.DELETE), Paths.extractPathSegments(rule.getDelete())); + } + case PATCH -> { + return new MethodAndPattern( + Optional.of(HttpRule.PatternCase.PATCH), Paths.extractPathSegments(rule.getPatch())); + } + case CUSTOM -> { + return new MethodAndPattern( + Optional.empty(), Paths.extractPathSegments(rule.getCustom().getPath())); + } + case PATTERN_NOT_SET -> throw new IllegalStateException("Pattern not set"); + default -> throw new IllegalStateException("Unexpected value: " + rule.getPatternCase()); + } + } +} diff --git a/core/src/test/java/me/ivovk/connect_rpc_java/core/http/PathsTest.java b/core/src/test/java/me/ivovk/connect_rpc_java/core/http/PathsTest.java index dccb1df..53ea4fe 100644 --- a/core/src/test/java/me/ivovk/connect_rpc_java/core/http/PathsTest.java +++ b/core/src/test/java/me/ivovk/connect_rpc_java/core/http/PathsTest.java @@ -11,40 +11,35 @@ class PathsTest { void testExtractPathSegmentsWithEmptyPath() { var result = Paths.extractPathSegments(""); - assertTrue(result.isPresent()); - assertEquals(Path.of(""), result.get()); + assertEquals(Path.of(""), result); } @Test void testExtractPathSegmentsWithRootPath() { var result = Paths.extractPathSegments("/"); - assertTrue(result.isPresent()); - assertEquals(Path.of(""), result.get()); + assertEquals(Path.of(""), result); } @Test void testExtractPathSegmentsWithSimplePath() { var result = Paths.extractPathSegments("/api/v1/users"); - assertTrue(result.isPresent()); - assertEquals(Path.of("api", "v1", "users"), result.get()); + assertEquals(Path.of("api", "v1", "users"), result); } @Test void testExtractPathSegmentsWithTrailingSlash() { var result = Paths.extractPathSegments("/api/v1/users/"); - assertTrue(result.isPresent()); - assertEquals(Path.of("api", "v1", "users"), result.get()); + assertEquals(Path.of("api", "v1", "users"), result); } @Test void testExtractPathSegmentsWithPathWithoutLeadingSlash() { var result = Paths.extractPathSegments("api/v1/users"); - assertTrue(result.isPresent()); - assertEquals(Path.of("api", "v1", "users"), result.get()); + assertEquals(Path.of("api", "v1", "users"), result); } @Test