From d45441076bf3e5e26c11505528c2da434183d469 Mon Sep 17 00:00:00 2001 From: Daniel Mashuda Date: Thu, 17 Apr 2025 11:33:38 -0400 Subject: [PATCH 01/12] Update gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 4b7275ac..ae2aac1f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,8 @@ dist/ *.log node_modules/ devserver.db +/.ijwb/ +/bazel-bin/ +/bazel-ldcli/ +/bazel-out/ +/bazel-testlogs/ From e0dc209886d50ddbe0b8a424f3cefb67d16b5676 Mon Sep 17 00:00:00 2001 From: Daniel Mashuda Date: Thu, 17 Apr 2025 11:34:56 -0400 Subject: [PATCH 02/12] Update gitignore --- .gitignore | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index ae2aac1f..0864dcc2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,8 @@ dist/ *.log node_modules/ devserver.db -/.ijwb/ -/bazel-bin/ -/bazel-ldcli/ -/bazel-out/ -/bazel-testlogs/ +.ijwb/ +bazel-bin +bazel-ldcli +bazel-out +bazel-testlogs From f1bf5eb8d5f6c32fde2cb0654276adb92fef7ea0 Mon Sep 17 00:00:00 2001 From: Daniel Mashuda Date: Thu, 17 Apr 2025 11:35:25 -0400 Subject: [PATCH 03/12] Initial bazel+gazelle commit --- BUILD.bazel | 18 ++ MODULE.bazel | 34 +++ MODULE.bazel.lock | 237 ++++++++++++++++++ cmd/BUILD.bazel | 52 ++++ cmd/analytics/BUILD.bazel | 14 ++ cmd/cliflags/BUILD.bazel | 8 + cmd/config/BUILD.bazel | 31 +++ cmd/dev_server/BUILD.bazel | 28 +++ cmd/flags/BUILD.bazel | 36 +++ cmd/login/BUILD.bazel | 18 ++ cmd/members/BUILD.bazel | 31 +++ cmd/resources/BUILD.bazel | 43 ++++ cmd/validators/BUILD.bazel | 25 ++ internal/analytics/BUILD.bazel | 16 ++ internal/client/BUILD.bazel | 9 + internal/config/BUILD.bazel | 31 +++ internal/dev_server/BUILD.bazel | 20 ++ internal/dev_server/adapters/BUILD.bazel | 23 ++ .../dev_server/adapters/internal/BUILD.bazel | 27 ++ .../dev_server/adapters/mocks/BUILD.bazel | 19 ++ internal/dev_server/api/BUILD.bazel | 32 +++ internal/dev_server/db/BUILD.bazel | 32 +++ internal/dev_server/db/backup/BUILD.bazel | 22 ++ internal/dev_server/model/BUILD.bazel | 59 +++++ internal/dev_server/model/mocks/BUILD.bazel | 15 ++ internal/dev_server/sdk/BUILD.bazel | 52 ++++ internal/dev_server/ui/BUILD.bazel | 9 + internal/environments/BUILD.bazel | 16 ++ internal/errors/BUILD.bazel | 23 ++ internal/flags/BUILD.bazel | 28 +++ internal/login/BUILD.bazel | 25 ++ internal/members/BUILD.bazel | 17 ++ internal/output/BUILD.bazel | 29 +++ internal/projects/BUILD.bazel | 17 ++ internal/quickstart/BUILD.bazel | 35 +++ internal/resources/BUILD.bazel | 22 ++ internal/sdks/BUILD.bazel | 42 ++++ 37 files changed, 1195 insertions(+) create mode 100644 BUILD.bazel create mode 100644 MODULE.bazel create mode 100644 MODULE.bazel.lock create mode 100644 cmd/BUILD.bazel create mode 100644 cmd/analytics/BUILD.bazel create mode 100644 cmd/cliflags/BUILD.bazel create mode 100644 cmd/config/BUILD.bazel create mode 100644 cmd/dev_server/BUILD.bazel create mode 100644 cmd/flags/BUILD.bazel create mode 100644 cmd/login/BUILD.bazel create mode 100644 cmd/members/BUILD.bazel create mode 100644 cmd/resources/BUILD.bazel create mode 100644 cmd/validators/BUILD.bazel create mode 100644 internal/analytics/BUILD.bazel create mode 100644 internal/client/BUILD.bazel create mode 100644 internal/config/BUILD.bazel create mode 100644 internal/dev_server/BUILD.bazel create mode 100644 internal/dev_server/adapters/BUILD.bazel create mode 100644 internal/dev_server/adapters/internal/BUILD.bazel create mode 100644 internal/dev_server/adapters/mocks/BUILD.bazel create mode 100644 internal/dev_server/api/BUILD.bazel create mode 100644 internal/dev_server/db/BUILD.bazel create mode 100644 internal/dev_server/db/backup/BUILD.bazel create mode 100644 internal/dev_server/model/BUILD.bazel create mode 100644 internal/dev_server/model/mocks/BUILD.bazel create mode 100644 internal/dev_server/sdk/BUILD.bazel create mode 100644 internal/dev_server/ui/BUILD.bazel create mode 100644 internal/environments/BUILD.bazel create mode 100644 internal/errors/BUILD.bazel create mode 100644 internal/flags/BUILD.bazel create mode 100644 internal/login/BUILD.bazel create mode 100644 internal/members/BUILD.bazel create mode 100644 internal/output/BUILD.bazel create mode 100644 internal/projects/BUILD.bazel create mode 100644 internal/quickstart/BUILD.bazel create mode 100644 internal/resources/BUILD.bazel create mode 100644 internal/sdks/BUILD.bazel diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 00000000..1b35e9fe --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1,18 @@ +load("@gazelle//:def.bzl", "gazelle") +load("@rules_go//go:def.bzl", "go_binary", "go_library") + +gazelle(name = "gazelle") + +go_library( + name = "ldcli_lib", + srcs = ["main.go"], + importpath = "github.com/launchdarkly/ldcli", + visibility = ["//visibility:private"], + deps = ["//cmd"], +) + +go_binary( + name = "ldcli", + embed = [":ldcli_lib"], + visibility = ["//visibility:public"], +) diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 00000000..55c56ff6 --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,34 @@ +module( + name = "ldcli", + version = "0.0.1", +) + +bazel_dep(name = "rules_go", version = "0.54.0") +bazel_dep(name = "gazelle", version = "0.43.0") + +go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") +go_deps.from_file(go_mod = "//:go.mod") + +use_repo( + go_deps, + "com_github_adrg_xdg", + "com_github_charmbracelet_bubbles", + "com_github_charmbracelet_bubbletea", + "com_github_charmbracelet_glamour", + "com_github_charmbracelet_lipgloss", + "com_github_getkin_kin_openapi", + "com_github_google_uuid", + "com_github_gorilla_handlers", + "com_github_gorilla_mux", + "com_github_iancoleman_strcase", + "com_github_launchdarkly_api_client_go_v14", + "com_github_launchdarkly_go_sdk_common_v3", + "com_github_launchdarkly_go_server_sdk_v7", + "com_github_launchdarkly_sdk_meta_api", + "com_github_mattn_go_sqlite3", + "com_github_mitchellh_go_homedir", + "com_github_muesli_reflow", + "com_github_oapi_codegen_oapi_codegen_v2", + "com_github_oapi_codegen_runtime", + "com_github_pkg_browser", + "com_github_pkg_errors", "com_github_samber_lo", "com_github_spf13_cobra", "com_github_spf13_pflag", "com_github_spf13_viper", "com_github_stretchr_testify", "in_gopkg_yaml_v3", "org_golang_x_exp", "org_golang_x_term", "org_uber_go_mock") diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock new file mode 100644 index 00000000..80dcdf41 --- /dev/null +++ b/MODULE.bazel.lock @@ -0,0 +1,237 @@ +{ + "lockFileVersion": 18, + "registryFileHashes": { + "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", + "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", + "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/source.json": "9be551b8d4e3ef76875c0d744b5d6a504a27e3ae67bc6b28f46415fd2d2957da", + "https://bcr.bazel.build/modules/bazel_features/1.1.0/MODULE.bazel": "cfd42ff3b815a5f39554d97182657f8c4b9719568eb7fded2b9135f084bf760b", + "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", + "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", + "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", + "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/source.json": "3e8379efaaef53ce35b7b8ba419df829315a880cb0a030e5bb45c96d6d5ecb5f", + "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", + "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", + "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", + "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", + "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/source.json": "f121b43eeefc7c29efbd51b83d08631e2347297c95aac9764a701f2a6a2bb953", + "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", + "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", + "https://bcr.bazel.build/modules/gazelle/0.32.0/MODULE.bazel": "b499f58a5d0d3537f3cf5b76d8ada18242f64ec474d8391247438bf04f58c7b8", + "https://bcr.bazel.build/modules/gazelle/0.33.0/MODULE.bazel": "a13a0f279b462b784fb8dd52a4074526c4a2afe70e114c7d09066097a46b3350", + "https://bcr.bazel.build/modules/gazelle/0.34.0/MODULE.bazel": "abdd8ce4d70978933209db92e436deb3a8b737859e9354fb5fd11fb5c2004c8a", + "https://bcr.bazel.build/modules/gazelle/0.36.0/MODULE.bazel": "e375d5d6e9a6ca59b0cb38b0540bc9a05b6aa926d322f2de268ad267a2ee74c0", + "https://bcr.bazel.build/modules/gazelle/0.43.0/MODULE.bazel": "846e1fe396eefc0f9ddad2b33e9bd364dd993fc2f42a88e31590fe0b0eefa3f0", + "https://bcr.bazel.build/modules/gazelle/0.43.0/source.json": "021a77f6625906d9d176e2fa351175e842622a5d45989312f2ad4924aab72df6", + "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", + "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/source.json": "41e9e129f80d8c8bf103a7acc337b76e54fad1214ac0a7084bf24f4cd924b8b4", + "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", + "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", + "https://bcr.bazel.build/modules/platforms/0.0.10/source.json": "f22828ff4cf021a6b577f1bf6341cb9dcd7965092a439f64fc1bb3b7a5ae4bd5", + "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", + "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", + "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", + "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", + "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", + "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", + "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", + "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", + "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e", + "https://bcr.bazel.build/modules/protobuf/29.0/source.json": "b857f93c796750eef95f0d61ee378f3420d00ee1dd38627b27193aa482f4f981", + "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/3.19.2/MODULE.bazel": "532ffe5f2186b69fdde039efe6df13ba726ff338c6bc82275ad433013fa10573", + "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/source.json": "be4789e951dd5301282729fe3d4938995dc4c1a81c2ff150afc9f1b0504c6022", + "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", + "https://bcr.bazel.build/modules/re2/2023-09-01/source.json": "e044ce89c2883cd957a2969a43e79f7752f9656f6b20050b62f90ede21ec6eb4", + "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", + "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", + "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", + "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", + "https://bcr.bazel.build/modules/rules_cc/0.0.14/MODULE.bazel": "5e343a3aac88b8d7af3b1b6d2093b55c347b8eefc2e7d1442f7a02dc8fea48ac", + "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", + "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", + "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", + "https://bcr.bazel.build/modules/rules_cc/0.0.17/source.json": "4db99b3f55c90ab28d14552aa0632533e3e8e5e9aea0f5c24ac0014282c2a7c5", + "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", + "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", + "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", + "https://bcr.bazel.build/modules/rules_go/0.41.0/MODULE.bazel": "55861d8e8bb0e62cbd2896f60ff303f62ffcb0eddb74ecb0e5c0cbe36fc292c8", + "https://bcr.bazel.build/modules/rules_go/0.42.0/MODULE.bazel": "8cfa875b9aa8c6fce2b2e5925e73c1388173ea3c32a0db4d2b4804b453c14270", + "https://bcr.bazel.build/modules/rules_go/0.46.0/MODULE.bazel": "3477df8bdcc49e698b9d25f734c4f3a9f5931ff34ee48a2c662be168f5f2d3fd", + "https://bcr.bazel.build/modules/rules_go/0.50.1/MODULE.bazel": "b91a308dc5782bb0a8021ad4330c81fea5bda77f96b9e4c117b9b9c8f6665ee0", + "https://bcr.bazel.build/modules/rules_go/0.54.0/MODULE.bazel": "ebec39ed510d0d4122b60764623dda92ca7f175479b511bf7cd5de7f38e86747", + "https://bcr.bazel.build/modules/rules_go/0.54.0/source.json": "6eb9b4f4fc27ab5be79d84dcfcf971beea6caa91a1b02088a9ee314c88915cf3", + "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", + "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", + "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", + "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6", + "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", + "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", + "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", + "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", + "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", + "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", + "https://bcr.bazel.build/modules/rules_java/8.11.0/MODULE.bazel": "c3d280bc5ff1038dcb3bacb95d3f6b83da8dd27bba57820ec89ea4085da767ad", + "https://bcr.bazel.build/modules/rules_java/8.11.0/source.json": "302b52a39259a85aa06ca3addb9787864ca3e03b432a5f964ea68244397e7544", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", + "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", + "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", + "https://bcr.bazel.build/modules/rules_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d", + "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/source.json": "6f5f5a5a4419ae4e37c35a5bb0a6ae657ed40b7abc5a5189111b47fcebe43197", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", + "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", + "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", + "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", + "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", + "https://bcr.bazel.build/modules/rules_proto/6.0.0/MODULE.bazel": "b531d7f09f58dce456cd61b4579ce8c86b38544da75184eadaf0a7cb7966453f", + "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1", + "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", + "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", + "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", + "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", + "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", + "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", + "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", + "https://bcr.bazel.build/modules/rules_python/0.40.0/source.json": "939d4bd2e3110f27bfb360292986bb79fd8dcefb874358ccd6cdaa7bda029320", + "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/source.json": "c55ed591aa5009401ddf80ded9762ac32c358d2517ee7820be981e2de9756cf3", + "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", + "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", + "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", + "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", + "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", + "https://bcr.bazel.build/modules/stardoc/0.7.1/source.json": "b6500ffcd7b48cd72c29bb67bcac781e12701cc0d6d55d266a652583cfcdab01", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.2.12/MODULE.bazel": "3b1a8834ada2a883674be8cbd36ede1b6ec481477ada359cd2d3ddc562340b27", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/MODULE.bazel": "af322bc08976524477c79d1e45e241b6efbeb918c497e8840b8ab116802dda79", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/source.json": "2be409ac3c7601245958cd4fcdff4288be79ed23bd690b4b951f500d54ee6e7d", + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" + }, + "selectedYankedVersions": {}, + "moduleExtensions": { + "@@platforms//host:extension.bzl%host_platform": { + "general": { + "bzlTransitiveDigest": "xelQcPZH8+tmuOHVjL9vDxMnnQNMlwj0SlvgoqBkm4U=", + "usagesDigest": "SeQiIN/f8/Qt9vYQk7qcXp4I4wJeEC0RnQDiaaJ4tb8=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "host_platform": { + "repoRuleId": "@@platforms//host:extension.bzl%host_platform_repo", + "attributes": {} + } + }, + "recordedRepoMappingEntries": [] + } + }, + "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { + "general": { + "bzlTransitiveDigest": "sFhcgPbDQehmbD1EOXzX4H1q/CD5df8zwG4kp4jbvr8=", + "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "com_github_jetbrains_kotlin_git": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_compiler_git_repository", + "attributes": { + "urls": [ + "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" + ], + "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" + } + }, + "com_github_jetbrains_kotlin": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_capabilities_repository", + "attributes": { + "git_repository_name": "com_github_jetbrains_kotlin_git", + "compiler_version": "1.9.23" + } + }, + "com_github_google_ksp": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:ksp.bzl%ksp_compiler_plugin_repository", + "attributes": { + "urls": [ + "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" + ], + "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", + "strip_version": "1.9.23-1.0.20" + } + }, + "com_github_pinterest_ktlint": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", + "urls": [ + "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" + ], + "executable": true + } + }, + "rules_android": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", + "strip_prefix": "rules_android-0.1.1", + "urls": [ + "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" + ] + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_kotlin+", + "bazel_tools", + "bazel_tools" + ] + ] + } + } + } +} diff --git a/cmd/BUILD.bazel b/cmd/BUILD.bazel new file mode 100644 index 00000000..bf19f26c --- /dev/null +++ b/cmd/BUILD.bazel @@ -0,0 +1,52 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "cmd", + srcs = [ + "cmdtest.go", + "quickstart.go", + "root.go", + "templates.go", + ], + importpath = "github.com/launchdarkly/ldcli/cmd", + visibility = ["//visibility:public"], + deps = [ + "//cmd/analytics", + "//cmd/cliflags", + "//cmd/config", + "//cmd/dev_server", + "//cmd/flags", + "//cmd/login", + "//cmd/members", + "//cmd/resources", + "//cmd/validators", + "//internal/analytics", + "//internal/config", + "//internal/dev_server", + "//internal/environments", + "//internal/errors", + "//internal/flags", + "//internal/members", + "//internal/projects", + "//internal/quickstart", + "//internal/resources", + "@com_github_charmbracelet_bubbletea//:bubbletea", + "@com_github_google_uuid//:uuid", + "@com_github_spf13_cobra//:cobra", + "@com_github_spf13_pflag//:pflag", + "@com_github_spf13_viper//:viper", + "@com_github_stretchr_testify//require", + "@org_golang_x_term//:term", + ], +) + +go_test( + name = "cmd_test", + srcs = ["root_test.go"], + deps = [ + ":cmd", + "//internal/analytics", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + ], +) diff --git a/cmd/analytics/BUILD.bazel b/cmd/analytics/BUILD.bazel new file mode 100644 index 00000000..1ccda029 --- /dev/null +++ b/cmd/analytics/BUILD.bazel @@ -0,0 +1,14 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "analytics", + srcs = ["analytics.go"], + importpath = "github.com/launchdarkly/ldcli/cmd/analytics", + visibility = ["//visibility:public"], + deps = [ + "//cmd/cliflags", + "@com_github_spf13_cobra//:cobra", + "@com_github_spf13_pflag//:pflag", + "@com_github_spf13_viper//:viper", + ], +) diff --git a/cmd/cliflags/BUILD.bazel b/cmd/cliflags/BUILD.bazel new file mode 100644 index 00000000..5e52c158 --- /dev/null +++ b/cmd/cliflags/BUILD.bazel @@ -0,0 +1,8 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "cliflags", + srcs = ["flags.go"], + importpath = "github.com/launchdarkly/ldcli/cmd/cliflags", + visibility = ["//visibility:public"], +) diff --git a/cmd/config/BUILD.bazel b/cmd/config/BUILD.bazel new file mode 100644 index 00000000..64640b2d --- /dev/null +++ b/cmd/config/BUILD.bazel @@ -0,0 +1,31 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "config", + srcs = ["config.go"], + importpath = "github.com/launchdarkly/ldcli/cmd/config", + visibility = ["//visibility:public"], + deps = [ + "//cmd/analytics", + "//cmd/cliflags", + "//internal/analytics", + "//internal/config", + "//internal/errors", + "//internal/output", + "@com_github_spf13_cobra//:cobra", + "@com_github_spf13_viper//:viper", + "@in_gopkg_yaml_v3//:yaml_v3", + ], +) + +go_test( + name = "config_test", + srcs = ["config_test.go"], + data = glob(["testdata/**"]), + deps = [ + "//cmd", + "//internal/analytics", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + ], +) diff --git a/cmd/dev_server/BUILD.bazel b/cmd/dev_server/BUILD.bazel new file mode 100644 index 00000000..f66f1ef1 --- /dev/null +++ b/cmd/dev_server/BUILD.bazel @@ -0,0 +1,28 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "dev_server", + srcs = [ + "dev_server.go", + "flags.go", + "overrides.go", + "projects.go", + "start_server.go", + ], + importpath = "github.com/launchdarkly/ldcli/cmd/dev_server", + visibility = ["//visibility:public"], + deps = [ + "//cmd/analytics", + "//cmd/cliflags", + "//cmd/resources", + "//cmd/validators", + "//internal/analytics", + "//internal/dev_server", + "//internal/dev_server/model", + "//internal/output", + "//internal/resources", + "@com_github_launchdarkly_go_sdk_common_v3//ldcontext", + "@com_github_spf13_cobra//:cobra", + "@com_github_spf13_viper//:viper", + ], +) diff --git a/cmd/flags/BUILD.bazel b/cmd/flags/BUILD.bazel new file mode 100644 index 00000000..0b227788 --- /dev/null +++ b/cmd/flags/BUILD.bazel @@ -0,0 +1,36 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "flags", + srcs = [ + "archive.go", + "toggle.go", + ], + importpath = "github.com/launchdarkly/ldcli/cmd/flags", + visibility = ["//visibility:public"], + deps = [ + "//cmd/cliflags", + "//cmd/resources", + "//cmd/validators", + "//internal/errors", + "//internal/output", + "//internal/resources", + "@com_github_spf13_cobra//:cobra", + "@com_github_spf13_viper//:viper", + ], +) + +go_test( + name = "flags_test", + srcs = [ + "archive_test.go", + "toggle_test.go", + ], + deps = [ + "//cmd", + "//internal/analytics", + "//internal/resources", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + ], +) diff --git a/cmd/login/BUILD.bazel b/cmd/login/BUILD.bazel new file mode 100644 index 00000000..7c557435 --- /dev/null +++ b/cmd/login/BUILD.bazel @@ -0,0 +1,18 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "login", + srcs = ["login.go"], + importpath = "github.com/launchdarkly/ldcli/cmd/login", + visibility = ["//visibility:public"], + deps = [ + "//cmd/cliflags", + "//cmd/config", + "//internal/config", + "//internal/login", + "//internal/resources", + "@com_github_pkg_browser//:browser", + "@com_github_spf13_cobra//:cobra", + "@com_github_spf13_viper//:viper", + ], +) diff --git a/cmd/members/BUILD.bazel b/cmd/members/BUILD.bazel new file mode 100644 index 00000000..cc64ae05 --- /dev/null +++ b/cmd/members/BUILD.bazel @@ -0,0 +1,31 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "members", + srcs = ["invite.go"], + importpath = "github.com/launchdarkly/ldcli/cmd/members", + visibility = ["//visibility:public"], + deps = [ + "//cmd/cliflags", + "//cmd/resources", + "//cmd/validators", + "//internal/errors", + "//internal/members", + "//internal/output", + "//internal/resources", + "@com_github_spf13_cobra//:cobra", + "@com_github_spf13_viper//:viper", + ], +) + +go_test( + name = "members_test", + srcs = ["invite_test.go"], + deps = [ + "//cmd", + "//internal/analytics", + "//internal/resources", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + ], +) diff --git a/cmd/resources/BUILD.bazel b/cmd/resources/BUILD.bazel new file mode 100644 index 00000000..86616570 --- /dev/null +++ b/cmd/resources/BUILD.bazel @@ -0,0 +1,43 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "resources", + srcs = [ + "resource_cmds.go", + "resource_utils.go", + "resources.go", + ], + importpath = "github.com/launchdarkly/ldcli/cmd/resources", + visibility = ["//visibility:public"], + deps = [ + "//cmd/analytics", + "//cmd/cliflags", + "//cmd/validators", + "//internal/analytics", + "//internal/errors", + "//internal/output", + "//internal/resources", + "@com_github_charmbracelet_glamour//:glamour", + "@com_github_getkin_kin_openapi//openapi3", + "@com_github_iancoleman_strcase//:strcase", + "@com_github_spf13_cobra//:cobra", + "@com_github_spf13_viper//:viper", + ], +) + +go_test( + name = "resources_test", + srcs = [ + "gen_resources_test.go", + "resource_cmds_test.go", + "resources_test.go", + ], + deps = [ + ":resources", + "//cmd", + "//internal/analytics", + "@com_github_getkin_kin_openapi//openapi3", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + ], +) diff --git a/cmd/validators/BUILD.bazel b/cmd/validators/BUILD.bazel new file mode 100644 index 00000000..9e751605 --- /dev/null +++ b/cmd/validators/BUILD.bazel @@ -0,0 +1,25 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "validators", + srcs = ["validators.go"], + importpath = "github.com/launchdarkly/ldcli/cmd/validators", + visibility = ["//visibility:public"], + deps = [ + "//cmd/cliflags", + "//internal/errors", + "//internal/output", + "@com_github_spf13_cobra//:cobra", + "@com_github_spf13_pflag//:pflag", + "@com_github_spf13_viper//:viper", + ], +) + +go_test( + name = "validators_test", + srcs = ["validators_test.go"], + deps = [ + ":validators", + "@com_github_stretchr_testify//assert", + ], +) diff --git a/internal/analytics/BUILD.bazel b/internal/analytics/BUILD.bazel new file mode 100644 index 00000000..a4a0374c --- /dev/null +++ b/internal/analytics/BUILD.bazel @@ -0,0 +1,16 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "analytics", + srcs = [ + "client.go", + "events.go", + "log_client.go", + "mock.go", + "noop_client.go", + "tracker.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/analytics", + visibility = ["//:__subpackages__"], + deps = ["@com_github_stretchr_testify//mock"], +) diff --git a/internal/client/BUILD.bazel b/internal/client/BUILD.bazel new file mode 100644 index 00000000..f2dbd15c --- /dev/null +++ b/internal/client/BUILD.bazel @@ -0,0 +1,9 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "client", + srcs = ["client.go"], + importpath = "github.com/launchdarkly/ldcli/internal/client", + visibility = ["//:__subpackages__"], + deps = ["@com_github_launchdarkly_api_client_go_v14//:api-client-go"], +) diff --git a/internal/config/BUILD.bazel b/internal/config/BUILD.bazel new file mode 100644 index 00000000..e5cd2a35 --- /dev/null +++ b/internal/config/BUILD.bazel @@ -0,0 +1,31 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "config", + srcs = [ + "config.go", + "config_service.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/config", + visibility = ["//:__subpackages__"], + deps = [ + "//cmd/cliflags", + "//internal/errors", + "//internal/output", + "//internal/resources", + "@com_github_mitchellh_go_homedir//:go-homedir", + "@in_gopkg_yaml_v3//:yaml_v3", + ], +) + +go_test( + name = "config_test", + srcs = ["config_test.go"], + deps = [ + ":config", + "//internal/resources", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + "@in_gopkg_yaml_v3//:yaml_v3", + ], +) diff --git a/internal/dev_server/BUILD.bazel b/internal/dev_server/BUILD.bazel new file mode 100644 index 00000000..80652fd0 --- /dev/null +++ b/internal/dev_server/BUILD.bazel @@ -0,0 +1,20 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "dev_server", + srcs = ["dev_server.go"], + importpath = "github.com/launchdarkly/ldcli/internal/dev_server", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/client", + "//internal/dev_server/adapters", + "//internal/dev_server/api", + "//internal/dev_server/db", + "//internal/dev_server/model", + "//internal/dev_server/sdk", + "//internal/dev_server/ui", + "@com_github_adrg_xdg//:xdg", + "@com_github_gorilla_handlers//:handlers", + "@com_github_gorilla_mux//:mux", + ], +) diff --git a/internal/dev_server/adapters/BUILD.bazel b/internal/dev_server/adapters/BUILD.bazel new file mode 100644 index 00000000..4dfc9ca8 --- /dev/null +++ b/internal/dev_server/adapters/BUILD.bazel @@ -0,0 +1,23 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "adapters", + srcs = [ + "api.go", + "context.go", + "middleware.go", + "sdk.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/dev_server/adapters", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/dev_server/adapters/internal", + "@com_github_launchdarkly_api_client_go_v14//:api-client-go", + "@com_github_launchdarkly_go_sdk_common_v3//ldcontext", + "@com_github_launchdarkly_go_sdk_common_v3//ldlog", + "@com_github_launchdarkly_go_server_sdk_v7//:go-server-sdk", + "@com_github_launchdarkly_go_server_sdk_v7//interfaces/flagstate", + "@com_github_launchdarkly_go_server_sdk_v7//ldcomponents", + "@com_github_pkg_errors//:errors", + ], +) diff --git a/internal/dev_server/adapters/internal/BUILD.bazel b/internal/dev_server/adapters/internal/BUILD.bazel new file mode 100644 index 00000000..0247b075 --- /dev/null +++ b/internal/dev_server/adapters/internal/BUILD.bazel @@ -0,0 +1,27 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "internal", + srcs = [ + "api_util.go", + "mocks.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/dev_server/adapters/internal", + visibility = ["//:__subpackages__"], + deps = [ + "@com_github_launchdarkly_api_client_go_v14//:api-client-go", + "@com_github_pkg_errors//:errors", + "@org_uber_go_mock//gomock", + ], +) + +go_test( + name = "internal_test", + srcs = ["api_util_test.go"], + embed = [":internal"], + deps = [ + "@com_github_launchdarkly_api_client_go_v14//:api-client-go", + "@com_github_stretchr_testify//assert", + "@org_uber_go_mock//gomock", + ], +) diff --git a/internal/dev_server/adapters/mocks/BUILD.bazel b/internal/dev_server/adapters/mocks/BUILD.bazel new file mode 100644 index 00000000..8ead1901 --- /dev/null +++ b/internal/dev_server/adapters/mocks/BUILD.bazel @@ -0,0 +1,19 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "mocks", + srcs = [ + "api.go", + "sdk.go", + "utils.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/dev_server/adapters/mocks", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/dev_server/adapters", + "@com_github_launchdarkly_api_client_go_v14//:api-client-go", + "@com_github_launchdarkly_go_sdk_common_v3//ldcontext", + "@com_github_launchdarkly_go_server_sdk_v7//interfaces/flagstate", + "@org_uber_go_mock//gomock", + ], +) diff --git a/internal/dev_server/api/BUILD.bazel b/internal/dev_server/api/BUILD.bazel new file mode 100644 index 00000000..a3cea3ba --- /dev/null +++ b/internal/dev_server/api/BUILD.bazel @@ -0,0 +1,32 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "api", + srcs = [ + "data_mapping.go", + "delete_flag_override.go", + "delete_project.go", + "error_handlers.go", + "get_backup.go", + "get_environments.go", + "get_project.go", + "get_projects.go", + "patch_project.go", + "post_add_project.go", + "put_override_flag.go", + "restore_backup.go", + "server.gen.go", + "server.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/dev_server/api", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/dev_server/model", + "@com_github_gorilla_mux//:mux", + "@com_github_launchdarkly_go_sdk_common_v3//ldcontext", + "@com_github_launchdarkly_go_sdk_common_v3//ldvalue", + "@com_github_oapi_codegen_runtime//:runtime", + "@com_github_oapi_codegen_runtime//strictmiddleware/nethttp", + "@com_github_pkg_errors//:errors", + ], +) diff --git a/internal/dev_server/db/BUILD.bazel b/internal/dev_server/db/BUILD.bazel new file mode 100644 index 00000000..1e084881 --- /dev/null +++ b/internal/dev_server/db/BUILD.bazel @@ -0,0 +1,32 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "db", + srcs = [ + "docs.go", + "sqlite.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/dev_server/db", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/dev_server/db/backup", + "//internal/dev_server/model", + "@com_github_launchdarkly_go_sdk_common_v3//ldvalue", + "@com_github_mattn_go_sqlite3//:go-sqlite3", + "@com_github_pkg_errors//:errors", + ], +) + +go_test( + name = "db_test", + srcs = ["sqlite_test.go"], + deps = [ + ":db", + "//internal/dev_server/model", + "@com_github_launchdarkly_go_sdk_common_v3//ldcontext", + "@com_github_launchdarkly_go_sdk_common_v3//ldvalue", + "@com_github_samber_lo//:lo", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + ], +) diff --git a/internal/dev_server/db/backup/BUILD.bazel b/internal/dev_server/db/backup/BUILD.bazel new file mode 100644 index 00000000..938bfa49 --- /dev/null +++ b/internal/dev_server/db/backup/BUILD.bazel @@ -0,0 +1,22 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "backup", + srcs = ["sqllite_backup.go"], + importpath = "github.com/launchdarkly/ldcli/internal/dev_server/db/backup", + visibility = ["//:__subpackages__"], + deps = [ + "@com_github_mattn_go_sqlite3//:go-sqlite3", + "@com_github_pkg_errors//:errors", + ], +) + +go_test( + name = "backup_test", + srcs = ["sqlite_backup_test.go"], + deps = [ + ":backup", + "@com_github_google_uuid//:uuid", + "@com_github_stretchr_testify//require", + ], +) diff --git a/internal/dev_server/model/BUILD.bazel b/internal/dev_server/model/BUILD.bazel new file mode 100644 index 00000000..caf70e20 --- /dev/null +++ b/internal/dev_server/model/BUILD.bazel @@ -0,0 +1,59 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "model", + srcs = [ + "docs.go", + "environments.go", + "err_already_exists.go", + "err_not_found.go", + "events.go", + "flags_state.go", + "observer.go", + "observer_middleware.go", + "override.go", + "project.go", + "restore.go", + "store.go", + "sync.go", + "variations.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/dev_server/model", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/dev_server/adapters", + "@com_github_google_uuid//:uuid", + "@com_github_gorilla_mux//:mux", + "@com_github_launchdarkly_go_sdk_common_v3//ldcontext", + "@com_github_launchdarkly_go_sdk_common_v3//ldvalue", + "@com_github_launchdarkly_go_server_sdk_v7//interfaces/flagstate", + "@com_github_pkg_errors//:errors", + ], +) + +go_test( + name = "model_test", + srcs = [ + "flags_state_test.go", + "observer_test.go", + "override_test.go", + "project_test.go", + "restore_test.go", + "sync_test.go", + ], + deps = [ + ":model", + "//internal/dev_server/adapters/mocks", + "//internal/dev_server/model/mocks", + "@com_github_google_uuid//:uuid", + "@com_github_launchdarkly_api_client_go_v14//:api-client-go", + "@com_github_launchdarkly_go_sdk_common_v3//ldcontext", + "@com_github_launchdarkly_go_sdk_common_v3//ldvalue", + "@com_github_launchdarkly_go_server_sdk_v7//interfaces/flagstate", + "@com_github_pkg_errors//:errors", + "@com_github_samber_lo//:lo", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + "@org_uber_go_mock//gomock", + ], +) diff --git a/internal/dev_server/model/mocks/BUILD.bazel b/internal/dev_server/model/mocks/BUILD.bazel new file mode 100644 index 00000000..a50e5140 --- /dev/null +++ b/internal/dev_server/model/mocks/BUILD.bazel @@ -0,0 +1,15 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "mocks", + srcs = [ + "observer.go", + "store.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/dev_server/model/mocks", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/dev_server/model", + "@org_uber_go_mock//gomock", + ], +) diff --git a/internal/dev_server/sdk/BUILD.bazel b/internal/dev_server/sdk/BUILD.bazel new file mode 100644 index 00000000..9bcc4e1e --- /dev/null +++ b/internal/dev_server/sdk/BUILD.bazel @@ -0,0 +1,52 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "sdk", + srcs = [ + "constant_response.go", + "cors.go", + "docs.go", + "get_client_flags.go", + "get_server_flags.go", + "polling.go", + "project_key_middleware.go", + "routes.go", + "server_flags.go", + "store_facade.go", + "stream_client_flags.go", + "stream_server_flags.go", + "streaming.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/dev_server/sdk", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/dev_server/model", + "@com_github_gorilla_mux//:mux", + "@com_github_launchdarkly_go_sdk_common_v3//ldvalue", + "@com_github_pkg_errors//:errors", + ], +) + +go_test( + name = "sdk_test", + srcs = [ + "go_sdk_test.go", + "http_test.go", + ], + embed = [":sdk"], + deps = [ + "//internal/dev_server/adapters/mocks", + "//internal/dev_server/db", + "//internal/dev_server/model", + "//internal/dev_server/model/mocks", + "@com_github_gorilla_mux//:mux", + "@com_github_launchdarkly_go_sdk_common_v3//ldcontext", + "@com_github_launchdarkly_go_sdk_common_v3//ldvalue", + "@com_github_launchdarkly_go_server_sdk_v7//:go-server-sdk", + "@com_github_launchdarkly_go_server_sdk_v7//interfaces", + "@com_github_launchdarkly_go_server_sdk_v7//interfaces/flagstate", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + "@org_uber_go_mock//gomock", + ], +) diff --git a/internal/dev_server/ui/BUILD.bazel b/internal/dev_server/ui/BUILD.bazel new file mode 100644 index 00000000..cbd88e9f --- /dev/null +++ b/internal/dev_server/ui/BUILD.bazel @@ -0,0 +1,9 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "ui", + srcs = ["asset_handler.go"], + embedsrcs = ["dist/index.html"], + importpath = "github.com/launchdarkly/ldcli/internal/dev_server/ui", + visibility = ["//:__subpackages__"], +) diff --git a/internal/environments/BUILD.bazel b/internal/environments/BUILD.bazel new file mode 100644 index 00000000..cef93a13 --- /dev/null +++ b/internal/environments/BUILD.bazel @@ -0,0 +1,16 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "environments", + srcs = [ + "client.go", + "mock_client.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/environments", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/client", + "//internal/errors", + "@com_github_stretchr_testify//mock", + ], +) diff --git a/internal/errors/BUILD.bazel b/internal/errors/BUILD.bazel new file mode 100644 index 00000000..0ad75541 --- /dev/null +++ b/internal/errors/BUILD.bazel @@ -0,0 +1,23 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "errors", + srcs = ["errors.go"], + importpath = "github.com/launchdarkly/ldcli/internal/errors", + visibility = ["//:__subpackages__"], + deps = [ + "//cmd/cliflags", + "@com_github_pkg_errors//:errors", + ], +) + +go_test( + name = "errors_test", + srcs = ["errors_test.go"], + deps = [ + ":errors", + "@com_github_launchdarkly_api_client_go_v14//:api-client-go", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + ], +) diff --git a/internal/flags/BUILD.bazel b/internal/flags/BUILD.bazel new file mode 100644 index 00000000..10cbe8b2 --- /dev/null +++ b/internal/flags/BUILD.bazel @@ -0,0 +1,28 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "flags", + srcs = [ + "client.go", + "flags.go", + "mock_client.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/flags", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/client", + "//internal/errors", + "@com_github_launchdarkly_api_client_go_v14//:api-client-go", + "@com_github_stretchr_testify//mock", + ], +) + +go_test( + name = "flags_test", + srcs = ["flags_test.go"], + deps = [ + ":flags", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + ], +) diff --git a/internal/login/BUILD.bazel b/internal/login/BUILD.bazel new file mode 100644 index 00000000..3381a5d2 --- /dev/null +++ b/internal/login/BUILD.bazel @@ -0,0 +1,25 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "login", + srcs = ["login.go"], + importpath = "github.com/launchdarkly/ldcli/internal/login", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/errors", + "//internal/resources", + ], +) + +go_test( + name = "login_test", + srcs = ["login_test.go"], + deps = [ + ":login", + "//internal/errors", + "//internal/resources", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//mock", + "@com_github_stretchr_testify//require", + ], +) diff --git a/internal/members/BUILD.bazel b/internal/members/BUILD.bazel new file mode 100644 index 00000000..6f2f02e1 --- /dev/null +++ b/internal/members/BUILD.bazel @@ -0,0 +1,17 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "members", + srcs = [ + "members.go", + "mock.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/members", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/client", + "//internal/errors", + "@com_github_launchdarkly_api_client_go_v14//:api-client-go", + "@com_github_stretchr_testify//mock", + ], +) diff --git a/internal/output/BUILD.bazel b/internal/output/BUILD.bazel new file mode 100644 index 00000000..edd67970 --- /dev/null +++ b/internal/output/BUILD.bazel @@ -0,0 +1,29 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "output", + srcs = [ + "output.go", + "outputters.go", + "plaintext_fns.go", + "resource_output.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/output", + visibility = ["//:__subpackages__"], + deps = ["//internal/errors"], +) + +go_test( + name = "output_test", + srcs = [ + "output_test.go", + "plaintext_fns_internal_test.go", + "resource_output_test.go", + ], + embed = [":output"], + deps = [ + "//internal/errors", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + ], +) diff --git a/internal/projects/BUILD.bazel b/internal/projects/BUILD.bazel new file mode 100644 index 00000000..85acec5a --- /dev/null +++ b/internal/projects/BUILD.bazel @@ -0,0 +1,17 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "projects", + srcs = [ + "mock.go", + "projects.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/projects", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/client", + "//internal/errors", + "@com_github_launchdarkly_api_client_go_v14//:api-client-go", + "@com_github_stretchr_testify//mock", + ], +) diff --git a/internal/quickstart/BUILD.bazel b/internal/quickstart/BUILD.bazel new file mode 100644 index 00000000..522f98a2 --- /dev/null +++ b/internal/quickstart/BUILD.bazel @@ -0,0 +1,35 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "quickstart", + srcs = [ + "choose_sdk.go", + "container.go", + "create_flag.go", + "help.go", + "messages.go", + "show_sdk_instructions.go", + "toggle_flag.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/quickstart", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/analytics", + "//internal/environments", + "//internal/errors", + "//internal/flags", + "//internal/sdks", + "@com_github_charmbracelet_bubbles//help", + "@com_github_charmbracelet_bubbles//key", + "@com_github_charmbracelet_bubbles//list", + "@com_github_charmbracelet_bubbles//spinner", + "@com_github_charmbracelet_bubbles//textinput", + "@com_github_charmbracelet_bubbles//viewport", + "@com_github_charmbracelet_bubbletea//:bubbletea", + "@com_github_charmbracelet_glamour//:glamour", + "@com_github_charmbracelet_lipgloss//:lipgloss", + "@com_github_launchdarkly_sdk_meta_api//sdkmeta", + "@com_github_muesli_reflow//wordwrap", + "@org_golang_x_exp//slices", + ], +) diff --git a/internal/resources/BUILD.bazel b/internal/resources/BUILD.bazel new file mode 100644 index 00000000..ccdbbfa6 --- /dev/null +++ b/internal/resources/BUILD.bazel @@ -0,0 +1,22 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "resources", + srcs = [ + "client.go", + "mock_client.go", + ], + importpath = "github.com/launchdarkly/ldcli/internal/resources", + visibility = ["//:__subpackages__"], + deps = ["//internal/errors"], +) + +go_test( + name = "resources_test", + srcs = ["client_test.go"], + deps = [ + ":resources", + "@com_github_stretchr_testify//assert", + "@com_github_stretchr_testify//require", + ], +) diff --git a/internal/sdks/BUILD.bazel b/internal/sdks/BUILD.bazel new file mode 100644 index 00000000..b7772f56 --- /dev/null +++ b/internal/sdks/BUILD.bazel @@ -0,0 +1,42 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "sdks", + srcs = ["sdks.go"], + embedsrcs = [ + "sdk_instructions/android.md", + "sdk_instructions/cpp-client-sdk.md", + "sdk_instructions/cpp-server-sdk.md", + "sdk_instructions/dotnet-client-sdk.md", + "sdk_instructions/dotnet-server-sdk.md", + "sdk_instructions/erlang-server-sdk.md", + "sdk_instructions/flutter-client-sdk.md", + "sdk_instructions/go-server-sdk.md", + "sdk_instructions/haskell-server-sdk.md", + "sdk_instructions/java-server-sdk.md", + "sdk_instructions/js-client-sdk.md", + "sdk_instructions/lua-server-sdk.md", + "sdk_instructions/node-client-sdk.md", + "sdk_instructions/node-server.md", + "sdk_instructions/php-server-sdk.md", + "sdk_instructions/python-server-sdk.md", + "sdk_instructions/react-client-sdk.md", + "sdk_instructions/react-native.md", + "sdk_instructions/roku.md", + "sdk_instructions/ruby-server-sdk.md", + "sdk_instructions/rust-server-sdk.md", + "sdk_instructions/swift-client-sdk.md", + "sdk_instructions/vue.md", + ], + importpath = "github.com/launchdarkly/ldcli/internal/sdks", + visibility = ["//:__subpackages__"], +) + +go_test( + name = "sdks_test", + srcs = ["sdks_test.go"], + deps = [ + ":sdks", + "@com_github_stretchr_testify//assert", + ], +) From f0f9ceea5403d620efd6116c38a35d7736bc4bcc Mon Sep 17 00:00:00 2001 From: Daniel Mashuda Date: Thu, 17 Apr 2025 12:25:48 -0400 Subject: [PATCH 04/12] Port go generate to genrule --- go.mod | 2 - go.sum | 8 - internal/dev_server/api/BUILD.bazel | 20 +- internal/dev_server/api/oapi-codegen-cfg.yaml | 1 - internal/dev_server/api/server.gen.go | 1289 ----------------- internal/dev_server/api/server.go | 1 - 6 files changed, 18 insertions(+), 1303 deletions(-) delete mode 100644 internal/dev_server/api/server.gen.go diff --git a/go.mod b/go.mod index 51d899c7..ff4a5022 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,6 @@ require ( github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/reflow v0.3.0 github.com/oapi-codegen/oapi-codegen/v2 v2.4.1 - github.com/oapi-codegen/runtime v1.1.1 github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c github.com/pkg/errors v0.9.1 github.com/samber/lo v1.49.1 @@ -37,7 +36,6 @@ require ( require ( github.com/alecthomas/chroma v0.10.0 // indirect - github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/atotto/clipboard v0.1.4 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect diff --git a/go.sum b/go.sum index 5049ac93..b060049d 100644 --- a/go.sum +++ b/go.sum @@ -33,13 +33,10 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= -github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= -github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aymanbagabas/go-osc52 v1.0.3/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= @@ -47,7 +44,6 @@ github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiE github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE= github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= @@ -182,7 +178,6 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/karlseguin/expect v1.0.2-0.20190806010014-778a5f0c6003 h1:vJ0Snvo+SLMY72r5J4sEfkuE7AFbixEP2qRbEcum/wA= github.com/karlseguin/expect v1.0.2-0.20190806010014-778a5f0c6003/go.mod h1:zNBxMY8P21owkeogJELCLeHIt+voOSduHYTFUbwRAV8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -260,8 +255,6 @@ github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oapi-codegen/oapi-codegen/v2 v2.4.1 h1:ykgG34472DWey7TSjd8vIfNykXgjOgYJZoQbKfEeY/Q= github.com/oapi-codegen/oapi-codegen/v2 v2.4.1/go.mod h1:N5+lY1tiTDV3V1BeHtOxeWXHoPVeApvsvjJqegfoaz8= -github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= -github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -324,7 +317,6 @@ github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= -github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= diff --git a/internal/dev_server/api/BUILD.bazel b/internal/dev_server/api/BUILD.bazel index a3cea3ba..b99e6abc 100644 --- a/internal/dev_server/api/BUILD.bazel +++ b/internal/dev_server/api/BUILD.bazel @@ -1,8 +1,25 @@ load("@rules_go//go:def.bzl", "go_library") +genrule( + name = "generate_server", + srcs = [ + "api.yaml", + "oapi-codegen-cfg.yaml", + ], + outs = ["server.gen.go"], + cmd = """ + $(location @com_github_oapi_codegen_oapi_codegen_v2//cmd/oapi-codegen) \ + -config $(location oapi-codegen-cfg.yaml) \ + $(location api.yaml) > $@ + """, + tools = ["@com_github_oapi_codegen_oapi_codegen_v2//cmd/oapi-codegen"], + visibility = ["//visibility:public"], +) + go_library( name = "api", srcs = [ + ":generate_server", "data_mapping.go", "delete_flag_override.go", "delete_project.go", @@ -15,7 +32,6 @@ go_library( "post_add_project.go", "put_override_flag.go", "restore_backup.go", - "server.gen.go", "server.go", ], importpath = "github.com/launchdarkly/ldcli/internal/dev_server/api", @@ -29,4 +45,4 @@ go_library( "@com_github_oapi_codegen_runtime//strictmiddleware/nethttp", "@com_github_pkg_errors//:errors", ], -) +) \ No newline at end of file diff --git a/internal/dev_server/api/oapi-codegen-cfg.yaml b/internal/dev_server/api/oapi-codegen-cfg.yaml index 871b6900..a5df3e81 100644 --- a/internal/dev_server/api/oapi-codegen-cfg.yaml +++ b/internal/dev_server/api/oapi-codegen-cfg.yaml @@ -4,4 +4,3 @@ generate: gorilla-server: true models: true strict-server: true -output: server.gen.go diff --git a/internal/dev_server/api/server.gen.go b/internal/dev_server/api/server.gen.go deleted file mode 100644 index 9d359b1a..00000000 --- a/internal/dev_server/api/server.gen.go +++ /dev/null @@ -1,1289 +0,0 @@ -// Package api provides primitives to interact with the openapi HTTP API. -// -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.3.0 DO NOT EDIT. -package api - -import ( - "context" - "encoding/json" - "fmt" - "io" - "net/http" - - "github.com/gorilla/mux" - "github.com/launchdarkly/go-sdk-common/v3/ldcontext" - "github.com/launchdarkly/go-sdk-common/v3/ldvalue" - "github.com/launchdarkly/ldcli/internal/dev_server/model" - "github.com/oapi-codegen/runtime" - strictnethttp "github.com/oapi-codegen/runtime/strictmiddleware/nethttp" -) - -// Defines values for GetProjectParamsExpand. -const ( - GetProjectParamsExpandAvailableVariations GetProjectParamsExpand = "availableVariations" - GetProjectParamsExpandOverrides GetProjectParamsExpand = "overrides" -) - -// Defines values for PatchProjectParamsExpand. -const ( - PatchProjectParamsExpandAvailableVariations PatchProjectParamsExpand = "availableVariations" - PatchProjectParamsExpandOverrides PatchProjectParamsExpand = "overrides" -) - -// Defines values for PostAddProjectParamsExpand. -const ( - AvailableVariations PostAddProjectParamsExpand = "availableVariations" - Overrides PostAddProjectParamsExpand = "overrides" -) - -// Context context object to use when evaluating flags in source environment -type Context = ldcontext.Context - -// Environment Environment -type Environment struct { - Key string `json:"key"` - Name string `json:"name"` -} - -// FlagValue value of a feature flag variation -type FlagValue = ldvalue.Value - -// Project Project -type Project struct { - // LastSyncedFromSource unix timestamp for the lat time the flag values were synced from the source environment - LastSyncedFromSource int64 `json:"_lastSyncedFromSource"` - - // AvailableVariations variations - AvailableVariations *map[string][]Variation `json:"availableVariations,omitempty"` - - // Context context object to use when evaluating flags in source environment - Context Context `json:"context"` - - // FlagsState flags and their values and version for a given project in the source environment - FlagsState *model.FlagsState `json:"flagsState,omitempty"` - - // Overrides overridden flags for the project - Overrides *model.FlagsState `json:"overrides,omitempty"` - - // SourceEnvironmentKey environment to copy flag values from - SourceEnvironmentKey string `json:"sourceEnvironmentKey"` -} - -// Variation variation of a flag -type Variation struct { - Id string `json:"_id"` - Description *string `json:"description,omitempty"` - Name *string `json:"name,omitempty"` - - // Value value of a feature flag variation - Value FlagValue `json:"value"` -} - -// FlagKey defines model for flagKey. -type FlagKey = string - -// ProjectExpand defines model for projectExpand. -type ProjectExpand = []string - -// ProjectKey defines model for projectKey. -type ProjectKey = string - -// ErrorResponse defines model for ErrorResponse. -type ErrorResponse struct { - // Code specific error code encountered - Code string `json:"code"` - - // Message description of the error - Message string `json:"message"` -} - -// FlagOverride defines model for FlagOverride. -type FlagOverride struct { - // Override whether or not this is an overridden value or one from the source environment - Override bool `json:"override"` - - // Value value of a feature flag variation - Value FlagValue `json:"value"` -} - -// GetProjectParams defines parameters for GetProject. -type GetProjectParams struct { - // Expand Available expand options for this endpoint. - Expand *ProjectExpand `form:"expand,omitempty" json:"expand,omitempty"` -} - -// GetProjectParamsExpand defines parameters for GetProject. -type GetProjectParamsExpand string - -// PatchProjectJSONBody defines parameters for PatchProject. -type PatchProjectJSONBody struct { - // Context context object to use when evaluating flags in source environment - Context *Context `json:"context,omitempty"` - - // SourceEnvironmentKey environment to copy flag values from - SourceEnvironmentKey *string `json:"sourceEnvironmentKey,omitempty"` -} - -// PatchProjectParams defines parameters for PatchProject. -type PatchProjectParams struct { - // Expand Available expand options for this endpoint. - Expand *ProjectExpand `form:"expand,omitempty" json:"expand,omitempty"` -} - -// PatchProjectParamsExpand defines parameters for PatchProject. -type PatchProjectParamsExpand string - -// PostAddProjectJSONBody defines parameters for PostAddProject. -type PostAddProjectJSONBody struct { - // Context context object to use when evaluating flags in source environment - Context *Context `json:"context,omitempty"` - - // SourceEnvironmentKey environment to copy flag values from - SourceEnvironmentKey string `json:"sourceEnvironmentKey"` -} - -// PostAddProjectParams defines parameters for PostAddProject. -type PostAddProjectParams struct { - // Expand Available expand options for this endpoint. - Expand *ProjectExpand `form:"expand,omitempty" json:"expand,omitempty"` -} - -// PostAddProjectParamsExpand defines parameters for PostAddProject. -type PostAddProjectParamsExpand string - -// GetEnvironmentsParams defines parameters for GetEnvironments. -type GetEnvironmentsParams struct { - // Name filter by environment name - Name *string `form:"name,omitempty" json:"name,omitempty"` - - // Limit limit the number of environments returned - Limit *int `form:"limit,omitempty" json:"limit,omitempty"` -} - -// PatchProjectJSONRequestBody defines body for PatchProject for application/json ContentType. -type PatchProjectJSONRequestBody PatchProjectJSONBody - -// PostAddProjectJSONRequestBody defines body for PostAddProject for application/json ContentType. -type PostAddProjectJSONRequestBody PostAddProjectJSONBody - -// PutOverrideFlagJSONRequestBody defines body for PutOverrideFlag for application/json ContentType. -type PutOverrideFlagJSONRequestBody = FlagValue - -// ServerInterface represents all server handlers. -type ServerInterface interface { - // get the backup - // (GET /dev/backup) - GetBackup(w http.ResponseWriter, r *http.Request) - // post backup - // (POST /dev/backup) - RestoreBackup(w http.ResponseWriter, r *http.Request) - // lists all projects that have been configured for the dev server - // (GET /dev/projects) - GetProjects(w http.ResponseWriter, r *http.Request) - // remove the specified project from the dev server - // (DELETE /dev/projects/{projectKey}) - DeleteProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey) - // get the specified project and its configuration for syncing from the LaunchDarkly Service - // (GET /dev/projects/{projectKey}) - GetProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params GetProjectParams) - // updates the project context or sourceEnvironmentKey then syncs. Input an empty body to only force a sync. - // (PATCH /dev/projects/{projectKey}) - PatchProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params PatchProjectParams) - // Add the project to the dev server - // (POST /dev/projects/{projectKey}) - PostAddProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params PostAddProjectParams) - // list all environments for the given project - // (GET /dev/projects/{projectKey}/environments) - GetEnvironments(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params GetEnvironmentsParams) - // remove override for flag - // (DELETE /dev/projects/{projectKey}/overrides/{flagKey}) - DeleteFlagOverride(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, flagKey FlagKey) - // override flag value with value provided in the body - // (PUT /dev/projects/{projectKey}/overrides/{flagKey}) - PutOverrideFlag(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, flagKey FlagKey) -} - -// ServerInterfaceWrapper converts contexts to parameters. -type ServerInterfaceWrapper struct { - Handler ServerInterface - HandlerMiddlewares []MiddlewareFunc - ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) -} - -type MiddlewareFunc func(http.Handler) http.Handler - -// GetBackup operation middleware -func (siw *ServerInterfaceWrapper) GetBackup(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetBackup(w, r) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r.WithContext(ctx)) -} - -// RestoreBackup operation middleware -func (siw *ServerInterfaceWrapper) RestoreBackup(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.RestoreBackup(w, r) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r.WithContext(ctx)) -} - -// GetProjects operation middleware -func (siw *ServerInterfaceWrapper) GetProjects(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetProjects(w, r) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r.WithContext(ctx)) -} - -// DeleteProject operation middleware -func (siw *ServerInterfaceWrapper) DeleteProject(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - var err error - - // ------------- Path parameter "projectKey" ------------- - var projectKey ProjectKey - - err = runtime.BindStyledParameterWithOptions("simple", "projectKey", mux.Vars(r)["projectKey"], &projectKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectKey", Err: err}) - return - } - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.DeleteProject(w, r, projectKey) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r.WithContext(ctx)) -} - -// GetProject operation middleware -func (siw *ServerInterfaceWrapper) GetProject(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - var err error - - // ------------- Path parameter "projectKey" ------------- - var projectKey ProjectKey - - err = runtime.BindStyledParameterWithOptions("simple", "projectKey", mux.Vars(r)["projectKey"], &projectKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectKey", Err: err}) - return - } - - // Parameter object where we will unmarshal all parameters from the context - var params GetProjectParams - - // ------------- Optional query parameter "expand" ------------- - - err = runtime.BindQueryParameter("form", true, false, "expand", r.URL.Query(), ¶ms.Expand) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "expand", Err: err}) - return - } - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetProject(w, r, projectKey, params) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r.WithContext(ctx)) -} - -// PatchProject operation middleware -func (siw *ServerInterfaceWrapper) PatchProject(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - var err error - - // ------------- Path parameter "projectKey" ------------- - var projectKey ProjectKey - - err = runtime.BindStyledParameterWithOptions("simple", "projectKey", mux.Vars(r)["projectKey"], &projectKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectKey", Err: err}) - return - } - - // Parameter object where we will unmarshal all parameters from the context - var params PatchProjectParams - - // ------------- Optional query parameter "expand" ------------- - - err = runtime.BindQueryParameter("form", true, false, "expand", r.URL.Query(), ¶ms.Expand) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "expand", Err: err}) - return - } - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.PatchProject(w, r, projectKey, params) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r.WithContext(ctx)) -} - -// PostAddProject operation middleware -func (siw *ServerInterfaceWrapper) PostAddProject(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - var err error - - // ------------- Path parameter "projectKey" ------------- - var projectKey ProjectKey - - err = runtime.BindStyledParameterWithOptions("simple", "projectKey", mux.Vars(r)["projectKey"], &projectKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectKey", Err: err}) - return - } - - // Parameter object where we will unmarshal all parameters from the context - var params PostAddProjectParams - - // ------------- Optional query parameter "expand" ------------- - - err = runtime.BindQueryParameter("form", true, false, "expand", r.URL.Query(), ¶ms.Expand) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "expand", Err: err}) - return - } - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.PostAddProject(w, r, projectKey, params) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r.WithContext(ctx)) -} - -// GetEnvironments operation middleware -func (siw *ServerInterfaceWrapper) GetEnvironments(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - var err error - - // ------------- Path parameter "projectKey" ------------- - var projectKey ProjectKey - - err = runtime.BindStyledParameterWithOptions("simple", "projectKey", mux.Vars(r)["projectKey"], &projectKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectKey", Err: err}) - return - } - - // Parameter object where we will unmarshal all parameters from the context - var params GetEnvironmentsParams - - // ------------- Optional query parameter "name" ------------- - - err = runtime.BindQueryParameter("form", true, false, "name", r.URL.Query(), ¶ms.Name) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "name", Err: err}) - return - } - - // ------------- Optional query parameter "limit" ------------- - - err = runtime.BindQueryParameter("form", true, false, "limit", r.URL.Query(), ¶ms.Limit) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "limit", Err: err}) - return - } - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetEnvironments(w, r, projectKey, params) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r.WithContext(ctx)) -} - -// DeleteFlagOverride operation middleware -func (siw *ServerInterfaceWrapper) DeleteFlagOverride(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - var err error - - // ------------- Path parameter "projectKey" ------------- - var projectKey ProjectKey - - err = runtime.BindStyledParameterWithOptions("simple", "projectKey", mux.Vars(r)["projectKey"], &projectKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectKey", Err: err}) - return - } - - // ------------- Path parameter "flagKey" ------------- - var flagKey FlagKey - - err = runtime.BindStyledParameterWithOptions("simple", "flagKey", mux.Vars(r)["flagKey"], &flagKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "flagKey", Err: err}) - return - } - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.DeleteFlagOverride(w, r, projectKey, flagKey) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r.WithContext(ctx)) -} - -// PutOverrideFlag operation middleware -func (siw *ServerInterfaceWrapper) PutOverrideFlag(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - var err error - - // ------------- Path parameter "projectKey" ------------- - var projectKey ProjectKey - - err = runtime.BindStyledParameterWithOptions("simple", "projectKey", mux.Vars(r)["projectKey"], &projectKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectKey", Err: err}) - return - } - - // ------------- Path parameter "flagKey" ------------- - var flagKey FlagKey - - err = runtime.BindStyledParameterWithOptions("simple", "flagKey", mux.Vars(r)["flagKey"], &flagKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "flagKey", Err: err}) - return - } - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.PutOverrideFlag(w, r, projectKey, flagKey) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r.WithContext(ctx)) -} - -type UnescapedCookieParamError struct { - ParamName string - Err error -} - -func (e *UnescapedCookieParamError) Error() string { - return fmt.Sprintf("error unescaping cookie parameter '%s'", e.ParamName) -} - -func (e *UnescapedCookieParamError) Unwrap() error { - return e.Err -} - -type UnmarshalingParamError struct { - ParamName string - Err error -} - -func (e *UnmarshalingParamError) Error() string { - return fmt.Sprintf("Error unmarshaling parameter %s as JSON: %s", e.ParamName, e.Err.Error()) -} - -func (e *UnmarshalingParamError) Unwrap() error { - return e.Err -} - -type RequiredParamError struct { - ParamName string -} - -func (e *RequiredParamError) Error() string { - return fmt.Sprintf("Query argument %s is required, but not found", e.ParamName) -} - -type RequiredHeaderError struct { - ParamName string - Err error -} - -func (e *RequiredHeaderError) Error() string { - return fmt.Sprintf("Header parameter %s is required, but not found", e.ParamName) -} - -func (e *RequiredHeaderError) Unwrap() error { - return e.Err -} - -type InvalidParamFormatError struct { - ParamName string - Err error -} - -func (e *InvalidParamFormatError) Error() string { - return fmt.Sprintf("Invalid format for parameter %s: %s", e.ParamName, e.Err.Error()) -} - -func (e *InvalidParamFormatError) Unwrap() error { - return e.Err -} - -type TooManyValuesForParamError struct { - ParamName string - Count int -} - -func (e *TooManyValuesForParamError) Error() string { - return fmt.Sprintf("Expected one value for %s, got %d", e.ParamName, e.Count) -} - -// Handler creates http.Handler with routing matching OpenAPI spec. -func Handler(si ServerInterface) http.Handler { - return HandlerWithOptions(si, GorillaServerOptions{}) -} - -type GorillaServerOptions struct { - BaseURL string - BaseRouter *mux.Router - Middlewares []MiddlewareFunc - ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) -} - -// HandlerFromMux creates http.Handler with routing matching OpenAPI spec based on the provided mux. -func HandlerFromMux(si ServerInterface, r *mux.Router) http.Handler { - return HandlerWithOptions(si, GorillaServerOptions{ - BaseRouter: r, - }) -} - -func HandlerFromMuxWithBaseURL(si ServerInterface, r *mux.Router, baseURL string) http.Handler { - return HandlerWithOptions(si, GorillaServerOptions{ - BaseURL: baseURL, - BaseRouter: r, - }) -} - -// HandlerWithOptions creates http.Handler with additional options -func HandlerWithOptions(si ServerInterface, options GorillaServerOptions) http.Handler { - r := options.BaseRouter - - if r == nil { - r = mux.NewRouter() - } - if options.ErrorHandlerFunc == nil { - options.ErrorHandlerFunc = func(w http.ResponseWriter, r *http.Request, err error) { - http.Error(w, err.Error(), http.StatusBadRequest) - } - } - wrapper := ServerInterfaceWrapper{ - Handler: si, - HandlerMiddlewares: options.Middlewares, - ErrorHandlerFunc: options.ErrorHandlerFunc, - } - - r.HandleFunc(options.BaseURL+"/dev/backup", wrapper.GetBackup).Methods("GET") - - r.HandleFunc(options.BaseURL+"/dev/backup", wrapper.RestoreBackup).Methods("POST") - - r.HandleFunc(options.BaseURL+"/dev/projects", wrapper.GetProjects).Methods("GET") - - r.HandleFunc(options.BaseURL+"/dev/projects/{projectKey}", wrapper.DeleteProject).Methods("DELETE") - - r.HandleFunc(options.BaseURL+"/dev/projects/{projectKey}", wrapper.GetProject).Methods("GET") - - r.HandleFunc(options.BaseURL+"/dev/projects/{projectKey}", wrapper.PatchProject).Methods("PATCH") - - r.HandleFunc(options.BaseURL+"/dev/projects/{projectKey}", wrapper.PostAddProject).Methods("POST") - - r.HandleFunc(options.BaseURL+"/dev/projects/{projectKey}/environments", wrapper.GetEnvironments).Methods("GET") - - r.HandleFunc(options.BaseURL+"/dev/projects/{projectKey}/overrides/{flagKey}", wrapper.DeleteFlagOverride).Methods("DELETE") - - r.HandleFunc(options.BaseURL+"/dev/projects/{projectKey}/overrides/{flagKey}", wrapper.PutOverrideFlag).Methods("PUT") - - return r -} - -type DbBackupApplicationvndSqlite3Response struct { - Body io.Reader - - ContentLength int64 -} - -type ErrorResponseJSONResponse struct { - // Code specific error code encountered - Code string `json:"code"` - - // Message description of the error - Message string `json:"message"` -} - -type FlagOverrideJSONResponse struct { - // Override whether or not this is an overridden value or one from the source environment - Override bool `json:"override"` - - // Value value of a feature flag variation - Value FlagValue `json:"value"` -} - -type ProjectJSONResponse Project - -type GetBackupRequestObject struct { -} - -type GetBackupResponseObject interface { - VisitGetBackupResponse(w http.ResponseWriter) error -} - -type GetBackup200ApplicationvndSqlite3Response struct { - DbBackupApplicationvndSqlite3Response -} - -func (response GetBackup200ApplicationvndSqlite3Response) VisitGetBackupResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/vnd.sqlite3") - if response.ContentLength != 0 { - w.Header().Set("Content-Length", fmt.Sprint(response.ContentLength)) - } - w.WriteHeader(200) - - if closer, ok := response.Body.(io.ReadCloser); ok { - defer closer.Close() - } - _, err := io.Copy(w, response.Body) - return err -} - -type RestoreBackupRequestObject struct { - Body io.Reader -} - -type RestoreBackupResponseObject interface { - VisitRestoreBackupResponse(w http.ResponseWriter) error -} - -type RestoreBackup200Response struct { -} - -func (response RestoreBackup200Response) VisitRestoreBackupResponse(w http.ResponseWriter) error { - w.WriteHeader(200) - return nil -} - -type GetProjectsRequestObject struct { -} - -type GetProjectsResponseObject interface { - VisitGetProjectsResponse(w http.ResponseWriter) error -} - -type GetProjects200JSONResponse []string - -func (response GetProjects200JSONResponse) VisitGetProjectsResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) -} - -type DeleteProjectRequestObject struct { - ProjectKey ProjectKey `json:"projectKey"` -} - -type DeleteProjectResponseObject interface { - VisitDeleteProjectResponse(w http.ResponseWriter) error -} - -type DeleteProject204Response struct { -} - -func (response DeleteProject204Response) VisitDeleteProjectResponse(w http.ResponseWriter) error { - w.WriteHeader(204) - return nil -} - -type DeleteProject404JSONResponse struct{ ErrorResponseJSONResponse } - -func (response DeleteProject404JSONResponse) VisitDeleteProjectResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) -} - -type GetProjectRequestObject struct { - ProjectKey ProjectKey `json:"projectKey"` - Params GetProjectParams -} - -type GetProjectResponseObject interface { - VisitGetProjectResponse(w http.ResponseWriter) error -} - -type GetProject200JSONResponse struct{ ProjectJSONResponse } - -func (response GetProject200JSONResponse) VisitGetProjectResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) -} - -type GetProject404Response struct { -} - -func (response GetProject404Response) VisitGetProjectResponse(w http.ResponseWriter) error { - w.WriteHeader(404) - return nil -} - -type PatchProjectRequestObject struct { - ProjectKey ProjectKey `json:"projectKey"` - Params PatchProjectParams - Body *PatchProjectJSONRequestBody -} - -type PatchProjectResponseObject interface { - VisitPatchProjectResponse(w http.ResponseWriter) error -} - -type PatchProject200JSONResponse struct{ ProjectJSONResponse } - -func (response PatchProject200JSONResponse) VisitPatchProjectResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) -} - -type PatchProject404Response struct { -} - -func (response PatchProject404Response) VisitPatchProjectResponse(w http.ResponseWriter) error { - w.WriteHeader(404) - return nil -} - -type PostAddProjectRequestObject struct { - ProjectKey ProjectKey `json:"projectKey"` - Params PostAddProjectParams - Body *PostAddProjectJSONRequestBody -} - -type PostAddProjectResponseObject interface { - VisitPostAddProjectResponse(w http.ResponseWriter) error -} - -type PostAddProject201JSONResponse struct{ ProjectJSONResponse } - -func (response PostAddProject201JSONResponse) VisitPostAddProjectResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(201) - - return json.NewEncoder(w).Encode(response) -} - -type PostAddProject400JSONResponse struct{ ErrorResponseJSONResponse } - -func (response PostAddProject400JSONResponse) VisitPostAddProjectResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) -} - -type PostAddProject409JSONResponse struct { - // Code specific error code encountered - Code string `json:"code"` - - // Message description of the error - Message string `json:"message"` -} - -func (response PostAddProject409JSONResponse) VisitPostAddProjectResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(409) - - return json.NewEncoder(w).Encode(response) -} - -type GetEnvironmentsRequestObject struct { - ProjectKey ProjectKey `json:"projectKey"` - Params GetEnvironmentsParams -} - -type GetEnvironmentsResponseObject interface { - VisitGetEnvironmentsResponse(w http.ResponseWriter) error -} - -type GetEnvironments200JSONResponse []Environment - -func (response GetEnvironments200JSONResponse) VisitGetEnvironmentsResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) -} - -type GetEnvironments400JSONResponse struct{ ErrorResponseJSONResponse } - -func (response GetEnvironments400JSONResponse) VisitGetEnvironmentsResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) -} - -type GetEnvironments404JSONResponse struct { - // Code specific error code encountered - Code string `json:"code"` - - // Message description of the error - Message string `json:"message"` -} - -func (response GetEnvironments404JSONResponse) VisitGetEnvironmentsResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(404) - - return json.NewEncoder(w).Encode(response) -} - -type DeleteFlagOverrideRequestObject struct { - ProjectKey ProjectKey `json:"projectKey"` - FlagKey FlagKey `json:"flagKey"` -} - -type DeleteFlagOverrideResponseObject interface { - VisitDeleteFlagOverrideResponse(w http.ResponseWriter) error -} - -type DeleteFlagOverride204Response struct { -} - -func (response DeleteFlagOverride204Response) VisitDeleteFlagOverrideResponse(w http.ResponseWriter) error { - w.WriteHeader(204) - return nil -} - -type DeleteFlagOverride404Response struct { -} - -func (response DeleteFlagOverride404Response) VisitDeleteFlagOverrideResponse(w http.ResponseWriter) error { - w.WriteHeader(404) - return nil -} - -type PutOverrideFlagRequestObject struct { - ProjectKey ProjectKey `json:"projectKey"` - FlagKey FlagKey `json:"flagKey"` - Body *PutOverrideFlagJSONRequestBody -} - -type PutOverrideFlagResponseObject interface { - VisitPutOverrideFlagResponse(w http.ResponseWriter) error -} - -type PutOverrideFlag200JSONResponse struct{ FlagOverrideJSONResponse } - -func (response PutOverrideFlag200JSONResponse) VisitPutOverrideFlagResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) -} - -type PutOverrideFlag400JSONResponse struct{ ErrorResponseJSONResponse } - -func (response PutOverrideFlag400JSONResponse) VisitPutOverrideFlagResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(400) - - return json.NewEncoder(w).Encode(response) -} - -// StrictServerInterface represents all server handlers. -type StrictServerInterface interface { - // get the backup - // (GET /dev/backup) - GetBackup(ctx context.Context, request GetBackupRequestObject) (GetBackupResponseObject, error) - // post backup - // (POST /dev/backup) - RestoreBackup(ctx context.Context, request RestoreBackupRequestObject) (RestoreBackupResponseObject, error) - // lists all projects that have been configured for the dev server - // (GET /dev/projects) - GetProjects(ctx context.Context, request GetProjectsRequestObject) (GetProjectsResponseObject, error) - // remove the specified project from the dev server - // (DELETE /dev/projects/{projectKey}) - DeleteProject(ctx context.Context, request DeleteProjectRequestObject) (DeleteProjectResponseObject, error) - // get the specified project and its configuration for syncing from the LaunchDarkly Service - // (GET /dev/projects/{projectKey}) - GetProject(ctx context.Context, request GetProjectRequestObject) (GetProjectResponseObject, error) - // updates the project context or sourceEnvironmentKey then syncs. Input an empty body to only force a sync. - // (PATCH /dev/projects/{projectKey}) - PatchProject(ctx context.Context, request PatchProjectRequestObject) (PatchProjectResponseObject, error) - // Add the project to the dev server - // (POST /dev/projects/{projectKey}) - PostAddProject(ctx context.Context, request PostAddProjectRequestObject) (PostAddProjectResponseObject, error) - // list all environments for the given project - // (GET /dev/projects/{projectKey}/environments) - GetEnvironments(ctx context.Context, request GetEnvironmentsRequestObject) (GetEnvironmentsResponseObject, error) - // remove override for flag - // (DELETE /dev/projects/{projectKey}/overrides/{flagKey}) - DeleteFlagOverride(ctx context.Context, request DeleteFlagOverrideRequestObject) (DeleteFlagOverrideResponseObject, error) - // override flag value with value provided in the body - // (PUT /dev/projects/{projectKey}/overrides/{flagKey}) - PutOverrideFlag(ctx context.Context, request PutOverrideFlagRequestObject) (PutOverrideFlagResponseObject, error) -} - -type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc -type StrictMiddlewareFunc = strictnethttp.StrictHTTPMiddlewareFunc - -type StrictHTTPServerOptions struct { - RequestErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) - ResponseErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) -} - -func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { - return &strictHandler{ssi: ssi, middlewares: middlewares, options: StrictHTTPServerOptions{ - RequestErrorHandlerFunc: func(w http.ResponseWriter, r *http.Request, err error) { - http.Error(w, err.Error(), http.StatusBadRequest) - }, - ResponseErrorHandlerFunc: func(w http.ResponseWriter, r *http.Request, err error) { - http.Error(w, err.Error(), http.StatusInternalServerError) - }, - }} -} - -func NewStrictHandlerWithOptions(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc, options StrictHTTPServerOptions) ServerInterface { - return &strictHandler{ssi: ssi, middlewares: middlewares, options: options} -} - -type strictHandler struct { - ssi StrictServerInterface - middlewares []StrictMiddlewareFunc - options StrictHTTPServerOptions -} - -// GetBackup operation middleware -func (sh *strictHandler) GetBackup(w http.ResponseWriter, r *http.Request) { - var request GetBackupRequestObject - - handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { - return sh.ssi.GetBackup(ctx, request.(GetBackupRequestObject)) - } - for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetBackup") - } - - response, err := handler(r.Context(), w, r, request) - - if err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } else if validResponse, ok := response.(GetBackupResponseObject); ok { - if err := validResponse.VisitGetBackupResponse(w); err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } - } else if response != nil { - sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) - } -} - -// RestoreBackup operation middleware -func (sh *strictHandler) RestoreBackup(w http.ResponseWriter, r *http.Request) { - var request RestoreBackupRequestObject - - request.Body = r.Body - - handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { - return sh.ssi.RestoreBackup(ctx, request.(RestoreBackupRequestObject)) - } - for _, middleware := range sh.middlewares { - handler = middleware(handler, "RestoreBackup") - } - - response, err := handler(r.Context(), w, r, request) - - if err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } else if validResponse, ok := response.(RestoreBackupResponseObject); ok { - if err := validResponse.VisitRestoreBackupResponse(w); err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } - } else if response != nil { - sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) - } -} - -// GetProjects operation middleware -func (sh *strictHandler) GetProjects(w http.ResponseWriter, r *http.Request) { - var request GetProjectsRequestObject - - handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { - return sh.ssi.GetProjects(ctx, request.(GetProjectsRequestObject)) - } - for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetProjects") - } - - response, err := handler(r.Context(), w, r, request) - - if err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } else if validResponse, ok := response.(GetProjectsResponseObject); ok { - if err := validResponse.VisitGetProjectsResponse(w); err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } - } else if response != nil { - sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) - } -} - -// DeleteProject operation middleware -func (sh *strictHandler) DeleteProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey) { - var request DeleteProjectRequestObject - - request.ProjectKey = projectKey - - handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { - return sh.ssi.DeleteProject(ctx, request.(DeleteProjectRequestObject)) - } - for _, middleware := range sh.middlewares { - handler = middleware(handler, "DeleteProject") - } - - response, err := handler(r.Context(), w, r, request) - - if err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } else if validResponse, ok := response.(DeleteProjectResponseObject); ok { - if err := validResponse.VisitDeleteProjectResponse(w); err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } - } else if response != nil { - sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) - } -} - -// GetProject operation middleware -func (sh *strictHandler) GetProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params GetProjectParams) { - var request GetProjectRequestObject - - request.ProjectKey = projectKey - request.Params = params - - handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { - return sh.ssi.GetProject(ctx, request.(GetProjectRequestObject)) - } - for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetProject") - } - - response, err := handler(r.Context(), w, r, request) - - if err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } else if validResponse, ok := response.(GetProjectResponseObject); ok { - if err := validResponse.VisitGetProjectResponse(w); err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } - } else if response != nil { - sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) - } -} - -// PatchProject operation middleware -func (sh *strictHandler) PatchProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params PatchProjectParams) { - var request PatchProjectRequestObject - - request.ProjectKey = projectKey - request.Params = params - - var body PatchProjectJSONRequestBody - if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) - return - } - request.Body = &body - - handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { - return sh.ssi.PatchProject(ctx, request.(PatchProjectRequestObject)) - } - for _, middleware := range sh.middlewares { - handler = middleware(handler, "PatchProject") - } - - response, err := handler(r.Context(), w, r, request) - - if err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } else if validResponse, ok := response.(PatchProjectResponseObject); ok { - if err := validResponse.VisitPatchProjectResponse(w); err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } - } else if response != nil { - sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) - } -} - -// PostAddProject operation middleware -func (sh *strictHandler) PostAddProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params PostAddProjectParams) { - var request PostAddProjectRequestObject - - request.ProjectKey = projectKey - request.Params = params - - var body PostAddProjectJSONRequestBody - if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) - return - } - request.Body = &body - - handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { - return sh.ssi.PostAddProject(ctx, request.(PostAddProjectRequestObject)) - } - for _, middleware := range sh.middlewares { - handler = middleware(handler, "PostAddProject") - } - - response, err := handler(r.Context(), w, r, request) - - if err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } else if validResponse, ok := response.(PostAddProjectResponseObject); ok { - if err := validResponse.VisitPostAddProjectResponse(w); err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } - } else if response != nil { - sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) - } -} - -// GetEnvironments operation middleware -func (sh *strictHandler) GetEnvironments(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params GetEnvironmentsParams) { - var request GetEnvironmentsRequestObject - - request.ProjectKey = projectKey - request.Params = params - - handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { - return sh.ssi.GetEnvironments(ctx, request.(GetEnvironmentsRequestObject)) - } - for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetEnvironments") - } - - response, err := handler(r.Context(), w, r, request) - - if err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } else if validResponse, ok := response.(GetEnvironmentsResponseObject); ok { - if err := validResponse.VisitGetEnvironmentsResponse(w); err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } - } else if response != nil { - sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) - } -} - -// DeleteFlagOverride operation middleware -func (sh *strictHandler) DeleteFlagOverride(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, flagKey FlagKey) { - var request DeleteFlagOverrideRequestObject - - request.ProjectKey = projectKey - request.FlagKey = flagKey - - handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { - return sh.ssi.DeleteFlagOverride(ctx, request.(DeleteFlagOverrideRequestObject)) - } - for _, middleware := range sh.middlewares { - handler = middleware(handler, "DeleteFlagOverride") - } - - response, err := handler(r.Context(), w, r, request) - - if err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } else if validResponse, ok := response.(DeleteFlagOverrideResponseObject); ok { - if err := validResponse.VisitDeleteFlagOverrideResponse(w); err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } - } else if response != nil { - sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) - } -} - -// PutOverrideFlag operation middleware -func (sh *strictHandler) PutOverrideFlag(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, flagKey FlagKey) { - var request PutOverrideFlagRequestObject - - request.ProjectKey = projectKey - request.FlagKey = flagKey - - var body PutOverrideFlagJSONRequestBody - if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) - return - } - request.Body = &body - - handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { - return sh.ssi.PutOverrideFlag(ctx, request.(PutOverrideFlagRequestObject)) - } - for _, middleware := range sh.middlewares { - handler = middleware(handler, "PutOverrideFlag") - } - - response, err := handler(r.Context(), w, r, request) - - if err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } else if validResponse, ok := response.(PutOverrideFlagResponseObject); ok { - if err := validResponse.VisitPutOverrideFlagResponse(w); err != nil { - sh.options.ResponseErrorHandlerFunc(w, r, err) - } - } else if response != nil { - sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) - } -} diff --git a/internal/dev_server/api/server.go b/internal/dev_server/api/server.go index 9dd8811f..d8660c32 100644 --- a/internal/dev_server/api/server.go +++ b/internal/dev_server/api/server.go @@ -1,6 +1,5 @@ package api -//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen -config oapi-codegen-cfg.yaml api.yaml var _ StrictServerInterface = server{} type server struct { From cfaf726f53157ef1143246359729611725f19a3d Mon Sep 17 00:00:00 2001 From: Daniel Mashuda Date: Thu, 17 Apr 2025 13:00:35 -0400 Subject: [PATCH 05/12] Commit --- MODULE.bazel | 13 +++++++++++-- go.mod | 2 ++ go.sum | 8 ++++++++ internal/dev_server/api/api.yaml | 2 ++ internal/dev_server/api/put_override_flag.go | 1 + tools.go | 1 + 6 files changed, 25 insertions(+), 2 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 55c56ff6..c403ded3 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -8,7 +8,6 @@ bazel_dep(name = "gazelle", version = "0.43.0") go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") go_deps.from_file(go_mod = "//:go.mod") - use_repo( go_deps, "com_github_adrg_xdg", @@ -31,4 +30,14 @@ use_repo( "com_github_oapi_codegen_oapi_codegen_v2", "com_github_oapi_codegen_runtime", "com_github_pkg_browser", - "com_github_pkg_errors", "com_github_samber_lo", "com_github_spf13_cobra", "com_github_spf13_pflag", "com_github_spf13_viper", "com_github_stretchr_testify", "in_gopkg_yaml_v3", "org_golang_x_exp", "org_golang_x_term", "org_uber_go_mock") + "com_github_pkg_errors", + "com_github_samber_lo", + "com_github_spf13_cobra", + "com_github_spf13_pflag", + "com_github_spf13_viper", + "com_github_stretchr_testify", + "in_gopkg_yaml_v3", + "org_golang_x_exp", + "org_golang_x_term", + "org_uber_go_mock", +) diff --git a/go.mod b/go.mod index ff4a5022..51d899c7 100644 --- a/go.mod +++ b/go.mod @@ -21,6 +21,7 @@ require ( github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/reflow v0.3.0 github.com/oapi-codegen/oapi-codegen/v2 v2.4.1 + github.com/oapi-codegen/runtime v1.1.1 github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c github.com/pkg/errors v0.9.1 github.com/samber/lo v1.49.1 @@ -36,6 +37,7 @@ require ( require ( github.com/alecthomas/chroma v0.10.0 // indirect + github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/atotto/clipboard v0.1.4 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect diff --git a/go.sum b/go.sum index b060049d..5049ac93 100644 --- a/go.sum +++ b/go.sum @@ -33,10 +33,13 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= +github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= +github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aymanbagabas/go-osc52 v1.0.3/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= @@ -44,6 +47,7 @@ github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiE github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE= github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= @@ -178,6 +182,7 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/karlseguin/expect v1.0.2-0.20190806010014-778a5f0c6003 h1:vJ0Snvo+SLMY72r5J4sEfkuE7AFbixEP2qRbEcum/wA= github.com/karlseguin/expect v1.0.2-0.20190806010014-778a5f0c6003/go.mod h1:zNBxMY8P21owkeogJELCLeHIt+voOSduHYTFUbwRAV8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -255,6 +260,8 @@ github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oapi-codegen/oapi-codegen/v2 v2.4.1 h1:ykgG34472DWey7TSjd8vIfNykXgjOgYJZoQbKfEeY/Q= github.com/oapi-codegen/oapi-codegen/v2 v2.4.1/go.mod h1:N5+lY1tiTDV3V1BeHtOxeWXHoPVeApvsvjJqegfoaz8= +github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= +github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -317,6 +324,7 @@ github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= diff --git a/internal/dev_server/api/api.yaml b/internal/dev_server/api/api.yaml index 01b1f717..a1b86db0 100644 --- a/internal/dev_server/api/api.yaml +++ b/internal/dev_server/api/api.yaml @@ -55,6 +55,8 @@ paths: $ref: "#/components/responses/Project" 404: description: No project found + 406: + description: No project found patch: summary: updates the project context or sourceEnvironmentKey then syncs. Input an empty body to only force a sync. operationId: patchProject diff --git a/internal/dev_server/api/put_override_flag.go b/internal/dev_server/api/put_override_flag.go index 917cabf3..4ba76f7d 100644 --- a/internal/dev_server/api/put_override_flag.go +++ b/internal/dev_server/api/put_override_flag.go @@ -3,6 +3,7 @@ package api import ( "context" + _ "github.com/oapi-codegen/runtime" "github.com/pkg/errors" "github.com/launchdarkly/ldcli/internal/dev_server/model" diff --git a/tools.go b/tools.go index a9d50a35..15c4a402 100644 --- a/tools.go +++ b/tools.go @@ -1,4 +1,5 @@ //go:build tools +// +build tools package main From aa4b3020b673b1c084376d55535156e19bba9c01 Mon Sep 17 00:00:00 2001 From: Daniel Mashuda Date: Thu, 17 Apr 2025 13:10:56 -0400 Subject: [PATCH 06/12] Commit --- BUILD.bazel | 10 +++++++++- internal/dev_server/api/api.yaml | 2 +- internal/dev_server/api/put_override_flag.go | 1 - tools.go | 1 + 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index 1b35e9fe..cd3be2cc 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -11,8 +11,16 @@ go_library( deps = ["//cmd"], ) +go_library( + name = "tool_deps", + srcs = ["tools.go"], + importpath = "github.com/launchdarkly/ldcli", + visibility = ["//visibility:private"], + deps = ["//cmd"], +) + go_binary( name = "ldcli", - embed = [":ldcli_lib"], + embed = [":ldcli_lib", ":tool_deps"], visibility = ["//visibility:public"], ) diff --git a/internal/dev_server/api/api.yaml b/internal/dev_server/api/api.yaml index a1b86db0..8d16fd57 100644 --- a/internal/dev_server/api/api.yaml +++ b/internal/dev_server/api/api.yaml @@ -55,7 +55,7 @@ paths: $ref: "#/components/responses/Project" 404: description: No project found - 406: + 405: description: No project found patch: summary: updates the project context or sourceEnvironmentKey then syncs. Input an empty body to only force a sync. diff --git a/internal/dev_server/api/put_override_flag.go b/internal/dev_server/api/put_override_flag.go index 4ba76f7d..917cabf3 100644 --- a/internal/dev_server/api/put_override_flag.go +++ b/internal/dev_server/api/put_override_flag.go @@ -3,7 +3,6 @@ package api import ( "context" - _ "github.com/oapi-codegen/runtime" "github.com/pkg/errors" "github.com/launchdarkly/ldcli/internal/dev_server/model" diff --git a/tools.go b/tools.go index 15c4a402..49333a80 100644 --- a/tools.go +++ b/tools.go @@ -4,4 +4,5 @@ package main import _ "github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen" +import _ "github.com/oapi-codegen/runtime" import _ "go.uber.org/mock/mockgen" From 98cd1747e7808379a03b52067d0eb2883409743d Mon Sep 17 00:00:00 2001 From: Daniel Mashuda Date: Thu, 17 Apr 2025 15:08:11 -0400 Subject: [PATCH 07/12] Fix tests --- cmd/resources/BUILD.bazel | 4 ++++ internal/dev_server/api/api.yaml | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/resources/BUILD.bazel b/cmd/resources/BUILD.bazel index 86616570..940ef951 100644 --- a/cmd/resources/BUILD.bazel +++ b/cmd/resources/BUILD.bazel @@ -32,6 +32,10 @@ go_test( "resource_cmds_test.go", "resources_test.go", ], + data = [ + "test_data/expected_template_data.json", + "test_data/test-openapi.json" + ], deps = [ ":resources", "//cmd", diff --git a/internal/dev_server/api/api.yaml b/internal/dev_server/api/api.yaml index 8d16fd57..01b1f717 100644 --- a/internal/dev_server/api/api.yaml +++ b/internal/dev_server/api/api.yaml @@ -55,8 +55,6 @@ paths: $ref: "#/components/responses/Project" 404: description: No project found - 405: - description: No project found patch: summary: updates the project context or sourceEnvironmentKey then syncs. Input an empty body to only force a sync. operationId: patchProject From 3a75044bdca4f9d5d3e93fdc7a873038b3bd0610 Mon Sep 17 00:00:00 2001 From: Daniel Mashuda Date: Thu, 17 Apr 2025 15:14:14 -0400 Subject: [PATCH 08/12] Try a bazel build --- .github/workflows/bazel.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/bazel.yml diff --git a/.github/workflows/bazel.yml b/.github/workflows/bazel.yml new file mode 100644 index 00000000..aa12a745 --- /dev/null +++ b/.github/workflows/bazel.yml @@ -0,0 +1,24 @@ +# This workflow will build a golang project +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go + +name: Go + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - uses: bazelbuild/setup-bazelisk@v3 + - name: Mount bazel cache # Optional + uses: actions/cache@v4 + with: + path: "~/.cache/bazel" + key: bazel + - run: bazel build //... From 0611bc0b003859d67f1d9f64ffc7da1dedabd576 Mon Sep 17 00:00:00 2001 From: Daniel Mashuda Date: Thu, 17 Apr 2025 15:18:23 -0400 Subject: [PATCH 09/12] Update action --- .github/workflows/bazel.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/bazel.yml b/.github/workflows/bazel.yml index aa12a745..b1577eb4 100644 --- a/.github/workflows/bazel.yml +++ b/.github/workflows/bazel.yml @@ -1,7 +1,7 @@ # This workflow will build a golang project # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go -name: Go +name: Bazel on: push: @@ -15,10 +15,18 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: bazelbuild/setup-bazelisk@v3 + - uses: bazel-contrib/setup-bazel@0.14.0 + with: + # Avoid downloading Bazel every time. + bazelisk-cache: true + # Store build cache per workflow. + disk-cache: ${{ github.workflow }} + # Share repository cache between workflows. + repository-cache: true - name: Mount bazel cache # Optional uses: actions/cache@v4 with: path: "~/.cache/bazel" key: bazel - run: bazel build //... + - run: bazel test //... From 35717d498c5cbb418711fc85a364ef60b12a632b Mon Sep 17 00:00:00 2001 From: Daniel Mashuda Date: Thu, 17 Apr 2025 15:20:49 -0400 Subject: [PATCH 10/12] Update workflow --- .github/workflows/bazel.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/bazel.yml b/.github/workflows/bazel.yml index b1577eb4..6c01effe 100644 --- a/.github/workflows/bazel.yml +++ b/.github/workflows/bazel.yml @@ -1,5 +1,3 @@ -# This workflow will build a golang project -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go name: Bazel @@ -23,10 +21,5 @@ jobs: disk-cache: ${{ github.workflow }} # Share repository cache between workflows. repository-cache: true - - name: Mount bazel cache # Optional - uses: actions/cache@v4 - with: - path: "~/.cache/bazel" - key: bazel - run: bazel build //... - run: bazel test //... From 838a669648be17c393217b2f80166027ffe4c94f Mon Sep 17 00:00:00 2001 From: Daniel Mashuda Date: Thu, 17 Apr 2025 15:33:54 -0400 Subject: [PATCH 11/12] Dont delete file --- internal/dev_server/api/server.gen.go | 1289 +++++++++++++++++++++++++ 1 file changed, 1289 insertions(+) create mode 100644 internal/dev_server/api/server.gen.go diff --git a/internal/dev_server/api/server.gen.go b/internal/dev_server/api/server.gen.go new file mode 100644 index 00000000..9d359b1a --- /dev/null +++ b/internal/dev_server/api/server.gen.go @@ -0,0 +1,1289 @@ +// Package api provides primitives to interact with the openapi HTTP API. +// +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.3.0 DO NOT EDIT. +package api + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + + "github.com/gorilla/mux" + "github.com/launchdarkly/go-sdk-common/v3/ldcontext" + "github.com/launchdarkly/go-sdk-common/v3/ldvalue" + "github.com/launchdarkly/ldcli/internal/dev_server/model" + "github.com/oapi-codegen/runtime" + strictnethttp "github.com/oapi-codegen/runtime/strictmiddleware/nethttp" +) + +// Defines values for GetProjectParamsExpand. +const ( + GetProjectParamsExpandAvailableVariations GetProjectParamsExpand = "availableVariations" + GetProjectParamsExpandOverrides GetProjectParamsExpand = "overrides" +) + +// Defines values for PatchProjectParamsExpand. +const ( + PatchProjectParamsExpandAvailableVariations PatchProjectParamsExpand = "availableVariations" + PatchProjectParamsExpandOverrides PatchProjectParamsExpand = "overrides" +) + +// Defines values for PostAddProjectParamsExpand. +const ( + AvailableVariations PostAddProjectParamsExpand = "availableVariations" + Overrides PostAddProjectParamsExpand = "overrides" +) + +// Context context object to use when evaluating flags in source environment +type Context = ldcontext.Context + +// Environment Environment +type Environment struct { + Key string `json:"key"` + Name string `json:"name"` +} + +// FlagValue value of a feature flag variation +type FlagValue = ldvalue.Value + +// Project Project +type Project struct { + // LastSyncedFromSource unix timestamp for the lat time the flag values were synced from the source environment + LastSyncedFromSource int64 `json:"_lastSyncedFromSource"` + + // AvailableVariations variations + AvailableVariations *map[string][]Variation `json:"availableVariations,omitempty"` + + // Context context object to use when evaluating flags in source environment + Context Context `json:"context"` + + // FlagsState flags and their values and version for a given project in the source environment + FlagsState *model.FlagsState `json:"flagsState,omitempty"` + + // Overrides overridden flags for the project + Overrides *model.FlagsState `json:"overrides,omitempty"` + + // SourceEnvironmentKey environment to copy flag values from + SourceEnvironmentKey string `json:"sourceEnvironmentKey"` +} + +// Variation variation of a flag +type Variation struct { + Id string `json:"_id"` + Description *string `json:"description,omitempty"` + Name *string `json:"name,omitempty"` + + // Value value of a feature flag variation + Value FlagValue `json:"value"` +} + +// FlagKey defines model for flagKey. +type FlagKey = string + +// ProjectExpand defines model for projectExpand. +type ProjectExpand = []string + +// ProjectKey defines model for projectKey. +type ProjectKey = string + +// ErrorResponse defines model for ErrorResponse. +type ErrorResponse struct { + // Code specific error code encountered + Code string `json:"code"` + + // Message description of the error + Message string `json:"message"` +} + +// FlagOverride defines model for FlagOverride. +type FlagOverride struct { + // Override whether or not this is an overridden value or one from the source environment + Override bool `json:"override"` + + // Value value of a feature flag variation + Value FlagValue `json:"value"` +} + +// GetProjectParams defines parameters for GetProject. +type GetProjectParams struct { + // Expand Available expand options for this endpoint. + Expand *ProjectExpand `form:"expand,omitempty" json:"expand,omitempty"` +} + +// GetProjectParamsExpand defines parameters for GetProject. +type GetProjectParamsExpand string + +// PatchProjectJSONBody defines parameters for PatchProject. +type PatchProjectJSONBody struct { + // Context context object to use when evaluating flags in source environment + Context *Context `json:"context,omitempty"` + + // SourceEnvironmentKey environment to copy flag values from + SourceEnvironmentKey *string `json:"sourceEnvironmentKey,omitempty"` +} + +// PatchProjectParams defines parameters for PatchProject. +type PatchProjectParams struct { + // Expand Available expand options for this endpoint. + Expand *ProjectExpand `form:"expand,omitempty" json:"expand,omitempty"` +} + +// PatchProjectParamsExpand defines parameters for PatchProject. +type PatchProjectParamsExpand string + +// PostAddProjectJSONBody defines parameters for PostAddProject. +type PostAddProjectJSONBody struct { + // Context context object to use when evaluating flags in source environment + Context *Context `json:"context,omitempty"` + + // SourceEnvironmentKey environment to copy flag values from + SourceEnvironmentKey string `json:"sourceEnvironmentKey"` +} + +// PostAddProjectParams defines parameters for PostAddProject. +type PostAddProjectParams struct { + // Expand Available expand options for this endpoint. + Expand *ProjectExpand `form:"expand,omitempty" json:"expand,omitempty"` +} + +// PostAddProjectParamsExpand defines parameters for PostAddProject. +type PostAddProjectParamsExpand string + +// GetEnvironmentsParams defines parameters for GetEnvironments. +type GetEnvironmentsParams struct { + // Name filter by environment name + Name *string `form:"name,omitempty" json:"name,omitempty"` + + // Limit limit the number of environments returned + Limit *int `form:"limit,omitempty" json:"limit,omitempty"` +} + +// PatchProjectJSONRequestBody defines body for PatchProject for application/json ContentType. +type PatchProjectJSONRequestBody PatchProjectJSONBody + +// PostAddProjectJSONRequestBody defines body for PostAddProject for application/json ContentType. +type PostAddProjectJSONRequestBody PostAddProjectJSONBody + +// PutOverrideFlagJSONRequestBody defines body for PutOverrideFlag for application/json ContentType. +type PutOverrideFlagJSONRequestBody = FlagValue + +// ServerInterface represents all server handlers. +type ServerInterface interface { + // get the backup + // (GET /dev/backup) + GetBackup(w http.ResponseWriter, r *http.Request) + // post backup + // (POST /dev/backup) + RestoreBackup(w http.ResponseWriter, r *http.Request) + // lists all projects that have been configured for the dev server + // (GET /dev/projects) + GetProjects(w http.ResponseWriter, r *http.Request) + // remove the specified project from the dev server + // (DELETE /dev/projects/{projectKey}) + DeleteProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey) + // get the specified project and its configuration for syncing from the LaunchDarkly Service + // (GET /dev/projects/{projectKey}) + GetProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params GetProjectParams) + // updates the project context or sourceEnvironmentKey then syncs. Input an empty body to only force a sync. + // (PATCH /dev/projects/{projectKey}) + PatchProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params PatchProjectParams) + // Add the project to the dev server + // (POST /dev/projects/{projectKey}) + PostAddProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params PostAddProjectParams) + // list all environments for the given project + // (GET /dev/projects/{projectKey}/environments) + GetEnvironments(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params GetEnvironmentsParams) + // remove override for flag + // (DELETE /dev/projects/{projectKey}/overrides/{flagKey}) + DeleteFlagOverride(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, flagKey FlagKey) + // override flag value with value provided in the body + // (PUT /dev/projects/{projectKey}/overrides/{flagKey}) + PutOverrideFlag(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, flagKey FlagKey) +} + +// ServerInterfaceWrapper converts contexts to parameters. +type ServerInterfaceWrapper struct { + Handler ServerInterface + HandlerMiddlewares []MiddlewareFunc + ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) +} + +type MiddlewareFunc func(http.Handler) http.Handler + +// GetBackup operation middleware +func (siw *ServerInterfaceWrapper) GetBackup(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetBackup(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r.WithContext(ctx)) +} + +// RestoreBackup operation middleware +func (siw *ServerInterfaceWrapper) RestoreBackup(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.RestoreBackup(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r.WithContext(ctx)) +} + +// GetProjects operation middleware +func (siw *ServerInterfaceWrapper) GetProjects(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetProjects(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r.WithContext(ctx)) +} + +// DeleteProject operation middleware +func (siw *ServerInterfaceWrapper) DeleteProject(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + var err error + + // ------------- Path parameter "projectKey" ------------- + var projectKey ProjectKey + + err = runtime.BindStyledParameterWithOptions("simple", "projectKey", mux.Vars(r)["projectKey"], &projectKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectKey", Err: err}) + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.DeleteProject(w, r, projectKey) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r.WithContext(ctx)) +} + +// GetProject operation middleware +func (siw *ServerInterfaceWrapper) GetProject(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + var err error + + // ------------- Path parameter "projectKey" ------------- + var projectKey ProjectKey + + err = runtime.BindStyledParameterWithOptions("simple", "projectKey", mux.Vars(r)["projectKey"], &projectKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectKey", Err: err}) + return + } + + // Parameter object where we will unmarshal all parameters from the context + var params GetProjectParams + + // ------------- Optional query parameter "expand" ------------- + + err = runtime.BindQueryParameter("form", true, false, "expand", r.URL.Query(), ¶ms.Expand) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "expand", Err: err}) + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetProject(w, r, projectKey, params) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r.WithContext(ctx)) +} + +// PatchProject operation middleware +func (siw *ServerInterfaceWrapper) PatchProject(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + var err error + + // ------------- Path parameter "projectKey" ------------- + var projectKey ProjectKey + + err = runtime.BindStyledParameterWithOptions("simple", "projectKey", mux.Vars(r)["projectKey"], &projectKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectKey", Err: err}) + return + } + + // Parameter object where we will unmarshal all parameters from the context + var params PatchProjectParams + + // ------------- Optional query parameter "expand" ------------- + + err = runtime.BindQueryParameter("form", true, false, "expand", r.URL.Query(), ¶ms.Expand) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "expand", Err: err}) + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.PatchProject(w, r, projectKey, params) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r.WithContext(ctx)) +} + +// PostAddProject operation middleware +func (siw *ServerInterfaceWrapper) PostAddProject(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + var err error + + // ------------- Path parameter "projectKey" ------------- + var projectKey ProjectKey + + err = runtime.BindStyledParameterWithOptions("simple", "projectKey", mux.Vars(r)["projectKey"], &projectKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectKey", Err: err}) + return + } + + // Parameter object where we will unmarshal all parameters from the context + var params PostAddProjectParams + + // ------------- Optional query parameter "expand" ------------- + + err = runtime.BindQueryParameter("form", true, false, "expand", r.URL.Query(), ¶ms.Expand) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "expand", Err: err}) + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.PostAddProject(w, r, projectKey, params) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r.WithContext(ctx)) +} + +// GetEnvironments operation middleware +func (siw *ServerInterfaceWrapper) GetEnvironments(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + var err error + + // ------------- Path parameter "projectKey" ------------- + var projectKey ProjectKey + + err = runtime.BindStyledParameterWithOptions("simple", "projectKey", mux.Vars(r)["projectKey"], &projectKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectKey", Err: err}) + return + } + + // Parameter object where we will unmarshal all parameters from the context + var params GetEnvironmentsParams + + // ------------- Optional query parameter "name" ------------- + + err = runtime.BindQueryParameter("form", true, false, "name", r.URL.Query(), ¶ms.Name) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "name", Err: err}) + return + } + + // ------------- Optional query parameter "limit" ------------- + + err = runtime.BindQueryParameter("form", true, false, "limit", r.URL.Query(), ¶ms.Limit) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "limit", Err: err}) + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetEnvironments(w, r, projectKey, params) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r.WithContext(ctx)) +} + +// DeleteFlagOverride operation middleware +func (siw *ServerInterfaceWrapper) DeleteFlagOverride(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + var err error + + // ------------- Path parameter "projectKey" ------------- + var projectKey ProjectKey + + err = runtime.BindStyledParameterWithOptions("simple", "projectKey", mux.Vars(r)["projectKey"], &projectKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectKey", Err: err}) + return + } + + // ------------- Path parameter "flagKey" ------------- + var flagKey FlagKey + + err = runtime.BindStyledParameterWithOptions("simple", "flagKey", mux.Vars(r)["flagKey"], &flagKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "flagKey", Err: err}) + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.DeleteFlagOverride(w, r, projectKey, flagKey) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r.WithContext(ctx)) +} + +// PutOverrideFlag operation middleware +func (siw *ServerInterfaceWrapper) PutOverrideFlag(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + var err error + + // ------------- Path parameter "projectKey" ------------- + var projectKey ProjectKey + + err = runtime.BindStyledParameterWithOptions("simple", "projectKey", mux.Vars(r)["projectKey"], &projectKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectKey", Err: err}) + return + } + + // ------------- Path parameter "flagKey" ------------- + var flagKey FlagKey + + err = runtime.BindStyledParameterWithOptions("simple", "flagKey", mux.Vars(r)["flagKey"], &flagKey, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "flagKey", Err: err}) + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.PutOverrideFlag(w, r, projectKey, flagKey) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r.WithContext(ctx)) +} + +type UnescapedCookieParamError struct { + ParamName string + Err error +} + +func (e *UnescapedCookieParamError) Error() string { + return fmt.Sprintf("error unescaping cookie parameter '%s'", e.ParamName) +} + +func (e *UnescapedCookieParamError) Unwrap() error { + return e.Err +} + +type UnmarshalingParamError struct { + ParamName string + Err error +} + +func (e *UnmarshalingParamError) Error() string { + return fmt.Sprintf("Error unmarshaling parameter %s as JSON: %s", e.ParamName, e.Err.Error()) +} + +func (e *UnmarshalingParamError) Unwrap() error { + return e.Err +} + +type RequiredParamError struct { + ParamName string +} + +func (e *RequiredParamError) Error() string { + return fmt.Sprintf("Query argument %s is required, but not found", e.ParamName) +} + +type RequiredHeaderError struct { + ParamName string + Err error +} + +func (e *RequiredHeaderError) Error() string { + return fmt.Sprintf("Header parameter %s is required, but not found", e.ParamName) +} + +func (e *RequiredHeaderError) Unwrap() error { + return e.Err +} + +type InvalidParamFormatError struct { + ParamName string + Err error +} + +func (e *InvalidParamFormatError) Error() string { + return fmt.Sprintf("Invalid format for parameter %s: %s", e.ParamName, e.Err.Error()) +} + +func (e *InvalidParamFormatError) Unwrap() error { + return e.Err +} + +type TooManyValuesForParamError struct { + ParamName string + Count int +} + +func (e *TooManyValuesForParamError) Error() string { + return fmt.Sprintf("Expected one value for %s, got %d", e.ParamName, e.Count) +} + +// Handler creates http.Handler with routing matching OpenAPI spec. +func Handler(si ServerInterface) http.Handler { + return HandlerWithOptions(si, GorillaServerOptions{}) +} + +type GorillaServerOptions struct { + BaseURL string + BaseRouter *mux.Router + Middlewares []MiddlewareFunc + ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) +} + +// HandlerFromMux creates http.Handler with routing matching OpenAPI spec based on the provided mux. +func HandlerFromMux(si ServerInterface, r *mux.Router) http.Handler { + return HandlerWithOptions(si, GorillaServerOptions{ + BaseRouter: r, + }) +} + +func HandlerFromMuxWithBaseURL(si ServerInterface, r *mux.Router, baseURL string) http.Handler { + return HandlerWithOptions(si, GorillaServerOptions{ + BaseURL: baseURL, + BaseRouter: r, + }) +} + +// HandlerWithOptions creates http.Handler with additional options +func HandlerWithOptions(si ServerInterface, options GorillaServerOptions) http.Handler { + r := options.BaseRouter + + if r == nil { + r = mux.NewRouter() + } + if options.ErrorHandlerFunc == nil { + options.ErrorHandlerFunc = func(w http.ResponseWriter, r *http.Request, err error) { + http.Error(w, err.Error(), http.StatusBadRequest) + } + } + wrapper := ServerInterfaceWrapper{ + Handler: si, + HandlerMiddlewares: options.Middlewares, + ErrorHandlerFunc: options.ErrorHandlerFunc, + } + + r.HandleFunc(options.BaseURL+"/dev/backup", wrapper.GetBackup).Methods("GET") + + r.HandleFunc(options.BaseURL+"/dev/backup", wrapper.RestoreBackup).Methods("POST") + + r.HandleFunc(options.BaseURL+"/dev/projects", wrapper.GetProjects).Methods("GET") + + r.HandleFunc(options.BaseURL+"/dev/projects/{projectKey}", wrapper.DeleteProject).Methods("DELETE") + + r.HandleFunc(options.BaseURL+"/dev/projects/{projectKey}", wrapper.GetProject).Methods("GET") + + r.HandleFunc(options.BaseURL+"/dev/projects/{projectKey}", wrapper.PatchProject).Methods("PATCH") + + r.HandleFunc(options.BaseURL+"/dev/projects/{projectKey}", wrapper.PostAddProject).Methods("POST") + + r.HandleFunc(options.BaseURL+"/dev/projects/{projectKey}/environments", wrapper.GetEnvironments).Methods("GET") + + r.HandleFunc(options.BaseURL+"/dev/projects/{projectKey}/overrides/{flagKey}", wrapper.DeleteFlagOverride).Methods("DELETE") + + r.HandleFunc(options.BaseURL+"/dev/projects/{projectKey}/overrides/{flagKey}", wrapper.PutOverrideFlag).Methods("PUT") + + return r +} + +type DbBackupApplicationvndSqlite3Response struct { + Body io.Reader + + ContentLength int64 +} + +type ErrorResponseJSONResponse struct { + // Code specific error code encountered + Code string `json:"code"` + + // Message description of the error + Message string `json:"message"` +} + +type FlagOverrideJSONResponse struct { + // Override whether or not this is an overridden value or one from the source environment + Override bool `json:"override"` + + // Value value of a feature flag variation + Value FlagValue `json:"value"` +} + +type ProjectJSONResponse Project + +type GetBackupRequestObject struct { +} + +type GetBackupResponseObject interface { + VisitGetBackupResponse(w http.ResponseWriter) error +} + +type GetBackup200ApplicationvndSqlite3Response struct { + DbBackupApplicationvndSqlite3Response +} + +func (response GetBackup200ApplicationvndSqlite3Response) VisitGetBackupResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/vnd.sqlite3") + if response.ContentLength != 0 { + w.Header().Set("Content-Length", fmt.Sprint(response.ContentLength)) + } + w.WriteHeader(200) + + if closer, ok := response.Body.(io.ReadCloser); ok { + defer closer.Close() + } + _, err := io.Copy(w, response.Body) + return err +} + +type RestoreBackupRequestObject struct { + Body io.Reader +} + +type RestoreBackupResponseObject interface { + VisitRestoreBackupResponse(w http.ResponseWriter) error +} + +type RestoreBackup200Response struct { +} + +func (response RestoreBackup200Response) VisitRestoreBackupResponse(w http.ResponseWriter) error { + w.WriteHeader(200) + return nil +} + +type GetProjectsRequestObject struct { +} + +type GetProjectsResponseObject interface { + VisitGetProjectsResponse(w http.ResponseWriter) error +} + +type GetProjects200JSONResponse []string + +func (response GetProjects200JSONResponse) VisitGetProjectsResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type DeleteProjectRequestObject struct { + ProjectKey ProjectKey `json:"projectKey"` +} + +type DeleteProjectResponseObject interface { + VisitDeleteProjectResponse(w http.ResponseWriter) error +} + +type DeleteProject204Response struct { +} + +func (response DeleteProject204Response) VisitDeleteProjectResponse(w http.ResponseWriter) error { + w.WriteHeader(204) + return nil +} + +type DeleteProject404JSONResponse struct{ ErrorResponseJSONResponse } + +func (response DeleteProject404JSONResponse) VisitDeleteProjectResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(404) + + return json.NewEncoder(w).Encode(response) +} + +type GetProjectRequestObject struct { + ProjectKey ProjectKey `json:"projectKey"` + Params GetProjectParams +} + +type GetProjectResponseObject interface { + VisitGetProjectResponse(w http.ResponseWriter) error +} + +type GetProject200JSONResponse struct{ ProjectJSONResponse } + +func (response GetProject200JSONResponse) VisitGetProjectResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type GetProject404Response struct { +} + +func (response GetProject404Response) VisitGetProjectResponse(w http.ResponseWriter) error { + w.WriteHeader(404) + return nil +} + +type PatchProjectRequestObject struct { + ProjectKey ProjectKey `json:"projectKey"` + Params PatchProjectParams + Body *PatchProjectJSONRequestBody +} + +type PatchProjectResponseObject interface { + VisitPatchProjectResponse(w http.ResponseWriter) error +} + +type PatchProject200JSONResponse struct{ ProjectJSONResponse } + +func (response PatchProject200JSONResponse) VisitPatchProjectResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type PatchProject404Response struct { +} + +func (response PatchProject404Response) VisitPatchProjectResponse(w http.ResponseWriter) error { + w.WriteHeader(404) + return nil +} + +type PostAddProjectRequestObject struct { + ProjectKey ProjectKey `json:"projectKey"` + Params PostAddProjectParams + Body *PostAddProjectJSONRequestBody +} + +type PostAddProjectResponseObject interface { + VisitPostAddProjectResponse(w http.ResponseWriter) error +} + +type PostAddProject201JSONResponse struct{ ProjectJSONResponse } + +func (response PostAddProject201JSONResponse) VisitPostAddProjectResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(201) + + return json.NewEncoder(w).Encode(response) +} + +type PostAddProject400JSONResponse struct{ ErrorResponseJSONResponse } + +func (response PostAddProject400JSONResponse) VisitPostAddProjectResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(400) + + return json.NewEncoder(w).Encode(response) +} + +type PostAddProject409JSONResponse struct { + // Code specific error code encountered + Code string `json:"code"` + + // Message description of the error + Message string `json:"message"` +} + +func (response PostAddProject409JSONResponse) VisitPostAddProjectResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(409) + + return json.NewEncoder(w).Encode(response) +} + +type GetEnvironmentsRequestObject struct { + ProjectKey ProjectKey `json:"projectKey"` + Params GetEnvironmentsParams +} + +type GetEnvironmentsResponseObject interface { + VisitGetEnvironmentsResponse(w http.ResponseWriter) error +} + +type GetEnvironments200JSONResponse []Environment + +func (response GetEnvironments200JSONResponse) VisitGetEnvironmentsResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type GetEnvironments400JSONResponse struct{ ErrorResponseJSONResponse } + +func (response GetEnvironments400JSONResponse) VisitGetEnvironmentsResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(400) + + return json.NewEncoder(w).Encode(response) +} + +type GetEnvironments404JSONResponse struct { + // Code specific error code encountered + Code string `json:"code"` + + // Message description of the error + Message string `json:"message"` +} + +func (response GetEnvironments404JSONResponse) VisitGetEnvironmentsResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(404) + + return json.NewEncoder(w).Encode(response) +} + +type DeleteFlagOverrideRequestObject struct { + ProjectKey ProjectKey `json:"projectKey"` + FlagKey FlagKey `json:"flagKey"` +} + +type DeleteFlagOverrideResponseObject interface { + VisitDeleteFlagOverrideResponse(w http.ResponseWriter) error +} + +type DeleteFlagOverride204Response struct { +} + +func (response DeleteFlagOverride204Response) VisitDeleteFlagOverrideResponse(w http.ResponseWriter) error { + w.WriteHeader(204) + return nil +} + +type DeleteFlagOverride404Response struct { +} + +func (response DeleteFlagOverride404Response) VisitDeleteFlagOverrideResponse(w http.ResponseWriter) error { + w.WriteHeader(404) + return nil +} + +type PutOverrideFlagRequestObject struct { + ProjectKey ProjectKey `json:"projectKey"` + FlagKey FlagKey `json:"flagKey"` + Body *PutOverrideFlagJSONRequestBody +} + +type PutOverrideFlagResponseObject interface { + VisitPutOverrideFlagResponse(w http.ResponseWriter) error +} + +type PutOverrideFlag200JSONResponse struct{ FlagOverrideJSONResponse } + +func (response PutOverrideFlag200JSONResponse) VisitPutOverrideFlagResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type PutOverrideFlag400JSONResponse struct{ ErrorResponseJSONResponse } + +func (response PutOverrideFlag400JSONResponse) VisitPutOverrideFlagResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(400) + + return json.NewEncoder(w).Encode(response) +} + +// StrictServerInterface represents all server handlers. +type StrictServerInterface interface { + // get the backup + // (GET /dev/backup) + GetBackup(ctx context.Context, request GetBackupRequestObject) (GetBackupResponseObject, error) + // post backup + // (POST /dev/backup) + RestoreBackup(ctx context.Context, request RestoreBackupRequestObject) (RestoreBackupResponseObject, error) + // lists all projects that have been configured for the dev server + // (GET /dev/projects) + GetProjects(ctx context.Context, request GetProjectsRequestObject) (GetProjectsResponseObject, error) + // remove the specified project from the dev server + // (DELETE /dev/projects/{projectKey}) + DeleteProject(ctx context.Context, request DeleteProjectRequestObject) (DeleteProjectResponseObject, error) + // get the specified project and its configuration for syncing from the LaunchDarkly Service + // (GET /dev/projects/{projectKey}) + GetProject(ctx context.Context, request GetProjectRequestObject) (GetProjectResponseObject, error) + // updates the project context or sourceEnvironmentKey then syncs. Input an empty body to only force a sync. + // (PATCH /dev/projects/{projectKey}) + PatchProject(ctx context.Context, request PatchProjectRequestObject) (PatchProjectResponseObject, error) + // Add the project to the dev server + // (POST /dev/projects/{projectKey}) + PostAddProject(ctx context.Context, request PostAddProjectRequestObject) (PostAddProjectResponseObject, error) + // list all environments for the given project + // (GET /dev/projects/{projectKey}/environments) + GetEnvironments(ctx context.Context, request GetEnvironmentsRequestObject) (GetEnvironmentsResponseObject, error) + // remove override for flag + // (DELETE /dev/projects/{projectKey}/overrides/{flagKey}) + DeleteFlagOverride(ctx context.Context, request DeleteFlagOverrideRequestObject) (DeleteFlagOverrideResponseObject, error) + // override flag value with value provided in the body + // (PUT /dev/projects/{projectKey}/overrides/{flagKey}) + PutOverrideFlag(ctx context.Context, request PutOverrideFlagRequestObject) (PutOverrideFlagResponseObject, error) +} + +type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc +type StrictMiddlewareFunc = strictnethttp.StrictHTTPMiddlewareFunc + +type StrictHTTPServerOptions struct { + RequestErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) + ResponseErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) +} + +func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { + return &strictHandler{ssi: ssi, middlewares: middlewares, options: StrictHTTPServerOptions{ + RequestErrorHandlerFunc: func(w http.ResponseWriter, r *http.Request, err error) { + http.Error(w, err.Error(), http.StatusBadRequest) + }, + ResponseErrorHandlerFunc: func(w http.ResponseWriter, r *http.Request, err error) { + http.Error(w, err.Error(), http.StatusInternalServerError) + }, + }} +} + +func NewStrictHandlerWithOptions(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc, options StrictHTTPServerOptions) ServerInterface { + return &strictHandler{ssi: ssi, middlewares: middlewares, options: options} +} + +type strictHandler struct { + ssi StrictServerInterface + middlewares []StrictMiddlewareFunc + options StrictHTTPServerOptions +} + +// GetBackup operation middleware +func (sh *strictHandler) GetBackup(w http.ResponseWriter, r *http.Request) { + var request GetBackupRequestObject + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.GetBackup(ctx, request.(GetBackupRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetBackup") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(GetBackupResponseObject); ok { + if err := validResponse.VisitGetBackupResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} + +// RestoreBackup operation middleware +func (sh *strictHandler) RestoreBackup(w http.ResponseWriter, r *http.Request) { + var request RestoreBackupRequestObject + + request.Body = r.Body + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.RestoreBackup(ctx, request.(RestoreBackupRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "RestoreBackup") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(RestoreBackupResponseObject); ok { + if err := validResponse.VisitRestoreBackupResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} + +// GetProjects operation middleware +func (sh *strictHandler) GetProjects(w http.ResponseWriter, r *http.Request) { + var request GetProjectsRequestObject + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.GetProjects(ctx, request.(GetProjectsRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetProjects") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(GetProjectsResponseObject); ok { + if err := validResponse.VisitGetProjectsResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} + +// DeleteProject operation middleware +func (sh *strictHandler) DeleteProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey) { + var request DeleteProjectRequestObject + + request.ProjectKey = projectKey + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.DeleteProject(ctx, request.(DeleteProjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "DeleteProject") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(DeleteProjectResponseObject); ok { + if err := validResponse.VisitDeleteProjectResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} + +// GetProject operation middleware +func (sh *strictHandler) GetProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params GetProjectParams) { + var request GetProjectRequestObject + + request.ProjectKey = projectKey + request.Params = params + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.GetProject(ctx, request.(GetProjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetProject") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(GetProjectResponseObject); ok { + if err := validResponse.VisitGetProjectResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} + +// PatchProject operation middleware +func (sh *strictHandler) PatchProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params PatchProjectParams) { + var request PatchProjectRequestObject + + request.ProjectKey = projectKey + request.Params = params + + var body PatchProjectJSONRequestBody + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + request.Body = &body + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.PatchProject(ctx, request.(PatchProjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "PatchProject") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(PatchProjectResponseObject); ok { + if err := validResponse.VisitPatchProjectResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} + +// PostAddProject operation middleware +func (sh *strictHandler) PostAddProject(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params PostAddProjectParams) { + var request PostAddProjectRequestObject + + request.ProjectKey = projectKey + request.Params = params + + var body PostAddProjectJSONRequestBody + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + request.Body = &body + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.PostAddProject(ctx, request.(PostAddProjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "PostAddProject") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(PostAddProjectResponseObject); ok { + if err := validResponse.VisitPostAddProjectResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} + +// GetEnvironments operation middleware +func (sh *strictHandler) GetEnvironments(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, params GetEnvironmentsParams) { + var request GetEnvironmentsRequestObject + + request.ProjectKey = projectKey + request.Params = params + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.GetEnvironments(ctx, request.(GetEnvironmentsRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetEnvironments") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(GetEnvironmentsResponseObject); ok { + if err := validResponse.VisitGetEnvironmentsResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} + +// DeleteFlagOverride operation middleware +func (sh *strictHandler) DeleteFlagOverride(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, flagKey FlagKey) { + var request DeleteFlagOverrideRequestObject + + request.ProjectKey = projectKey + request.FlagKey = flagKey + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.DeleteFlagOverride(ctx, request.(DeleteFlagOverrideRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "DeleteFlagOverride") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(DeleteFlagOverrideResponseObject); ok { + if err := validResponse.VisitDeleteFlagOverrideResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} + +// PutOverrideFlag operation middleware +func (sh *strictHandler) PutOverrideFlag(w http.ResponseWriter, r *http.Request, projectKey ProjectKey, flagKey FlagKey) { + var request PutOverrideFlagRequestObject + + request.ProjectKey = projectKey + request.FlagKey = flagKey + + var body PutOverrideFlagJSONRequestBody + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + request.Body = &body + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.PutOverrideFlag(ctx, request.(PutOverrideFlagRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "PutOverrideFlag") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(PutOverrideFlagResponseObject); ok { + if err := validResponse.VisitPutOverrideFlagResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} From f646e0e7600a0544c67d67c6b4f71af5d888585c Mon Sep 17 00:00:00 2001 From: Daniel Mashuda Date: Thu, 17 Apr 2025 15:45:06 -0400 Subject: [PATCH 12/12] Fix lint --- internal/dev_server/api/BUILD.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/dev_server/api/BUILD.bazel b/internal/dev_server/api/BUILD.bazel index b99e6abc..fcf5e577 100644 --- a/internal/dev_server/api/BUILD.bazel +++ b/internal/dev_server/api/BUILD.bazel @@ -45,4 +45,4 @@ go_library( "@com_github_oapi_codegen_runtime//strictmiddleware/nethttp", "@com_github_pkg_errors//:errors", ], -) \ No newline at end of file +)