From 937da6a6e07aa7d0e2da275d8afc7de17254796c Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Mon, 27 Jul 2026 12:10:35 -0700 Subject: [PATCH 1/7] Update dsc version to 3.4-preview.1 and jsonschema crate to 0.49.1 - Bump dsc crate version from 3.3.0-rc.1 to 3.4.0-preview.1 - Update jsonschema dependency from 0.38 to 0.49.1 - Add referencing 0.49.1 as workspace dependency - Migrate to new Keyword<'i> trait API (generic lifetime parameter) - Replace ValidationError::custom() 4-arg calls with single message arg - Replace with_resource() calls with static VSCODE_DIALECT_REGISTRY using referencing::Registry and with_registry() - Update VSCodeValidationOptionsExtensions trait to use lifetime parameter - Update tests to use schema_path() instead of instance_path() for factory-time validation errors (behavioral change in new API) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- Cargo.lock | 85 ++++++-- Cargo.toml | 4 +- dsc/Cargo.toml | 2 +- lib/dsc-lib-jsonschema/Cargo.toml | 1 + .../tests/vscode/keywords/allow_comments.rs | 2 +- .../vscode/keywords/allow_trailing_commas.rs | 2 +- .../vscode/keywords/completion_detail.rs | 2 +- .../tests/vscode/keywords/default_snippets.rs | 8 +- .../vscode/keywords/deprecation_message.rs | 2 +- .../tests/vscode/keywords/do_not_suggest.rs | 2 +- .../vscode/keywords/enum_descriptions.rs | 4 +- .../src/tests/vscode/keywords/enum_details.rs | 4 +- .../tests/vscode/keywords/enum_sort_texts.rs | 4 +- .../tests/vscode/keywords/error_message.rs | 2 +- .../vscode/keywords/markdown_description.rs | 2 +- .../keywords/markdown_enum_descriptions.rs | 4 +- .../src/tests/vscode/keywords/mod.rs | 2 +- .../vscode/keywords/pattern_error_message.rs | 2 +- .../vscode/keywords/suggest_sort_text.rs | 2 +- lib/dsc-lib-jsonschema/src/vscode/dialect.rs | 12 +- .../src/vscode/keywords/allow_comments.rs | 14 +- .../vscode/keywords/allow_trailing_commas.rs | 14 +- .../src/vscode/keywords/completion_detail.rs | 14 +- .../src/vscode/keywords/default_snippets.rs | 20 +- .../vscode/keywords/deprecation_message.rs | 14 +- .../src/vscode/keywords/do_not_suggest.rs | 14 +- .../src/vscode/keywords/enum_descriptions.rs | 17 +- .../src/vscode/keywords/enum_details.rs | 17 +- .../src/vscode/keywords/enum_sort_texts.rs | 17 +- .../src/vscode/keywords/error_message.rs | 14 +- .../vscode/keywords/markdown_description.rs | 14 +- .../keywords/markdown_enum_descriptions.rs | 17 +- .../src/vscode/keywords/mod.rs | 3 +- .../vscode/keywords/pattern_error_message.rs | 14 +- .../src/vscode/keywords/suggest_sort_text.rs | 17 +- .../src/vscode/keywords/vscode_keyword.rs | 48 +---- .../keywords/vscode_keyword_definition.rs | 12 +- lib/dsc-lib-jsonschema/src/vscode/mod.rs | 2 +- .../vscode/validation_options_extensions.rs | 192 ++++++++++-------- .../src/vscode/vocabulary.rs | 12 +- 40 files changed, 308 insertions(+), 326 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 09d8d3790..adb4bb00c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -742,7 +742,7 @@ dependencies = [ [[package]] name = "dsc" -version = "3.3.0-rc.1" +version = "3.4.0-preview.1" dependencies = [ "clap", "clap_complete", @@ -844,6 +844,7 @@ dependencies = [ "dsc-lib-jsonschema-macros", "jsonschema", "pretty_assertions", + "referencing", "regex", "rust-i18n", "schemars", @@ -1084,9 +1085,9 @@ dependencies = [ [[package]] name = "fancy-regex" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72cf461f865c862bb7dc573f643dd6a2b6842f7c30b07882b56bd148cc2761b8" +checksum = "e1e1dacd0d2082dfcf1351c4bdd566bbe89a2b263235a2b50058f1e130a47277" dependencies = [ "bit-set", "regex-automata", @@ -1381,21 +1382,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.1" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" dependencies = [ "allocator-api2", "equivalent", "foldhash 0.2.0", ] -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" - [[package]] name = "heck" version = "0.5.0" @@ -1742,31 +1737,56 @@ dependencies = [ [[package]] name = "jsonschema" -version = "0.38.1" +version = "0.49.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89f50532ce4a0ba3ae930212908d8ec50e7806065c059fe9c75da2ece6132294" +checksum = "9cc9116a0f75b7336e55eb2a2a0ddef86c37cadf02924a571751aa123d5a0290" dependencies = [ "ahash", "bytecount", "data-encoding", "email_address", - "fancy-regex 0.17.0", + "fancy-regex 0.18.0", "fraction", "getrandom 0.3.4", "idna", "itoa", + "jsonschema-regex", + "jsonschema-value", "num-cmp", "num-traits", "percent-encoding", "referencing", "regex", - "regex-syntax", "serde", "serde_json", + "strum", "unicode-general-category", "uuid-simd", ] +[[package]] +name = "jsonschema-regex" +version = "0.49.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628a1f02bda4651d9a6088ee6386a92f0ee96255b0c99e9dfe1be91bf83bd838" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "jsonschema-value" +version = "0.49.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75d94a372f8d81d070fd405065c6b1168d8248d1d6adad073ac708de254698c6" +dependencies = [ + "ahash", + "bytecount", + "fraction", + "num-cmp", + "num-traits", + "serde_json", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1839,6 +1859,12 @@ version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" +[[package]] +name = "micromap" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a86d3146ed3995b5913c414f6664344b9617457320782e64f0bb44afd49d74" + [[package]] name = "miette" version = "7.6.0" @@ -2636,14 +2662,16 @@ dependencies = [ [[package]] name = "referencing" -version = "0.38.1" +version = "0.49.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15a8af0c6bb8eaf8b07cb06fc31ff30ca6fe19fb99afa476c276d8b24f365b0b" +checksum = "978badf4419c9d0e1bc6e7466e99277f829d768257670c46d88121ca75e34bf7" dependencies = [ "ahash", "fluent-uri", "getrandom 0.3.4", - "hashbrown 0.16.1", + "hashbrown 0.17.1", + "itoa", + "micromap", "parking_lot", "percent-encoding", "serde_json", @@ -3121,6 +3149,27 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "syn" version = "2.0.119" diff --git a/Cargo.toml b/Cargo.toml index 66a670c49..c623cbf4d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -173,7 +173,9 @@ async-stream = { version = "0.3" } # dsc-lib-security_context::windows is_elevated = { version = "0.1" } # dsc, dsc-lib -jsonschema = { version = "0.38", default-features = false } +jsonschema = { version = "0.49.1", default-features = false } +# dsc-lib-jsonschema +referencing = { version = "0.49.1" } # dsc-lib linked-hash-map = { version = "0.5" } # dsc-lib diff --git a/dsc/Cargo.toml b/dsc/Cargo.toml index 11e007f71..a6530d729 100644 --- a/dsc/Cargo.toml +++ b/dsc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dsc" -version = "3.3.0-rc.1" +version = "3.4.0-preview.1" edition = "2024" [dependencies] diff --git a/lib/dsc-lib-jsonschema/Cargo.toml b/lib/dsc-lib-jsonschema/Cargo.toml index a9ae91999..3a2cf6167 100644 --- a/lib/dsc-lib-jsonschema/Cargo.toml +++ b/lib/dsc-lib-jsonschema/Cargo.toml @@ -8,6 +8,7 @@ doctest = false # Disable doc tests by default for compilation speed [dependencies] jsonschema = { workspace = true } +referencing = { workspace = true } regex = { workspace = true } rust-i18n = { workspace = true } schemars = { workspace = true } diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/allow_comments.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/allow_comments.rs index dfb470884..05ec1b5f6 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/allow_comments.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/allow_comments.rs @@ -21,7 +21,7 @@ use crate::vscode::keywords::{AllowCommentsKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/allowComments" ); diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/allow_trailing_commas.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/allow_trailing_commas.rs index eeb277d45..e5b7837d4 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/allow_trailing_commas.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/allow_trailing_commas.rs @@ -21,7 +21,7 @@ use crate::vscode::keywords::{AllowTrailingCommasKeyword, VSCodeKeywordDefinitio })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/allowTrailingCommas" ); diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/completion_detail.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/completion_detail.rs index 0b9a9c8a8..f56be7e85 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/completion_detail.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/completion_detail.rs @@ -21,7 +21,7 @@ use crate::vscode::keywords::{CompletionDetailKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/completionDetail" ); diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/default_snippets.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/default_snippets.rs index 4009893c4..1252fa0ae 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/default_snippets.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/default_snippets.rs @@ -21,7 +21,7 @@ use crate::vscode::keywords::{DefaultSnippetsKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/defaultSnippets" ); @@ -41,7 +41,7 @@ use crate::vscode::keywords::{DefaultSnippetsKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/defaultSnippets" ); @@ -60,7 +60,7 @@ use crate::vscode::keywords::{DefaultSnippetsKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/defaultSnippets" ); @@ -79,7 +79,7 @@ use crate::vscode::keywords::{DefaultSnippetsKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/defaultSnippets" ); diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/deprecation_message.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/deprecation_message.rs index dc3f69e2f..1b24a884a 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/deprecation_message.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/deprecation_message.rs @@ -21,7 +21,7 @@ use crate::vscode::keywords::{DeprecationMessageKeyword, VSCodeKeywordDefinition })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/deprecationMessage" ); diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/do_not_suggest.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/do_not_suggest.rs index ae9012566..3efedbe0c 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/do_not_suggest.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/do_not_suggest.rs @@ -21,7 +21,7 @@ use crate::vscode::keywords::{DoNotSuggestKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/doNotSuggest" ); diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/enum_descriptions.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/enum_descriptions.rs index 9ca03a694..d8e1baef3 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/enum_descriptions.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/enum_descriptions.rs @@ -21,7 +21,7 @@ use crate::vscode::keywords::{EnumDescriptionsKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/enumDescriptions" ); @@ -44,7 +44,7 @@ use crate::vscode::keywords::{EnumDescriptionsKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/enumDescriptions" ); diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/enum_details.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/enum_details.rs index e9d89dd7d..d04dfc763 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/enum_details.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/enum_details.rs @@ -21,7 +21,7 @@ use crate::vscode::keywords::{EnumDetailsKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/enumDetails" ); @@ -44,7 +44,7 @@ use crate::vscode::keywords::{EnumDetailsKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/enumDetails" ); diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/enum_sort_texts.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/enum_sort_texts.rs index 6e23c8ea5..27b3fc863 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/enum_sort_texts.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/enum_sort_texts.rs @@ -21,7 +21,7 @@ use crate::vscode::keywords::{EnumSortTextsKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/enumSortTexts" ); @@ -44,7 +44,7 @@ use crate::vscode::keywords::{EnumSortTextsKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/enumSortTexts" ); diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/error_message.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/error_message.rs index 8e2188be9..4e3c1cab1 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/error_message.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/error_message.rs @@ -21,7 +21,7 @@ use crate::vscode::keywords::{ErrorMessageKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/errorMessage" ); diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/markdown_description.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/markdown_description.rs index b1794d272..5367339bf 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/markdown_description.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/markdown_description.rs @@ -21,7 +21,7 @@ use crate::vscode::keywords::{MarkdownDescriptionKeyword, VSCodeKeywordDefinitio })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/markdownDescription" ); diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/markdown_enum_descriptions.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/markdown_enum_descriptions.rs index 6f2e5ccae..c6ba49b03 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/markdown_enum_descriptions.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/markdown_enum_descriptions.rs @@ -21,7 +21,7 @@ use crate::vscode::keywords::{MarkdownEnumDescriptionsKeyword, VSCodeKeywordDefi })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/markdownEnumDescriptions" ); @@ -44,7 +44,7 @@ use crate::vscode::keywords::{MarkdownEnumDescriptionsKeyword, VSCodeKeywordDefi })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/markdownEnumDescriptions" ); diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/mod.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/mod.rs index beda45237..5ddd5c4ad 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/mod.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/mod.rs @@ -23,7 +23,7 @@ /// })).unwrap_err().to_owned(); /// /// assert_eq!( -/// validation_error.instance_path().as_str(), +/// validation_error.schema_path().as_str(), /// "/allowComments" /// ); /// ``` diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/pattern_error_message.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/pattern_error_message.rs index 24baada48..304e57dd0 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/pattern_error_message.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/pattern_error_message.rs @@ -21,7 +21,7 @@ use crate::vscode::keywords::{PatternErrorMessageKeyword, VSCodeKeywordDefinitio })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/patternErrorMessage" ); diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/suggest_sort_text.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/suggest_sort_text.rs index 29fde7b7c..e25c4193b 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/suggest_sort_text.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/keywords/suggest_sort_text.rs @@ -21,7 +21,7 @@ use crate::vscode::keywords::{SuggestSortTextKeyword, VSCodeKeywordDefinition}; })).unwrap_err().to_owned(); assert_eq!( - validation_error.instance_path().as_str(), + validation_error.schema_path().as_str(), "/suggestSortText" ); diff --git a/lib/dsc-lib-jsonschema/src/vscode/dialect.rs b/lib/dsc-lib-jsonschema/src/vscode/dialect.rs index e1c3e8da3..db499ca54 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/dialect.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/dialect.rs @@ -3,7 +3,7 @@ use std::sync::{Arc, LazyLock}; -use jsonschema::Resource; +use referencing::Resource; use rust_i18n::t; use schemars::{JsonSchema, Schema, SchemaGenerator, generate::SchemaSettings, json_schema}; @@ -181,6 +181,16 @@ impl VSCodeDialect { pub fn schema_resource_canonical(generator: &mut schemars::SchemaGenerator) -> Resource { Resource::from_contents(Self::json_schema_canonical(generator).to_value()) } + + /// Returns the default canonical schema for the dialect as a [`Resource`]. + /// + /// This is a convenience method that uses the default [`SchemaGenerator`] settings. + #[must_use] + pub fn default_schema_resource() -> Resource { + use schemars::{SchemaGenerator, generate::SchemaSettings}; + let generator = &mut SchemaGenerator::new(SchemaSettings::draft2020_12()); + Self::schema_resource_canonical(generator) + } } impl JsonSchema for VSCodeDialect { diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/allow_comments.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/allow_comments.rs index fccdda7ce..51072297c 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/allow_comments.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/allow_comments.rs @@ -27,15 +27,12 @@ impl VSCodeKeywordDefinition for AllowCommentsKeyword { fn keyword_factory<'a>( _parent: &'a serde_json::Map, value: &'a serde_json::Value, - path: Location, - ) -> Result, ValidationError<'a>> { + _path: Location, + ) -> Result Keyword<'instance>>, ValidationError<'a>> { if let Some(v) = value.as_bool() { Ok(Box::new(Self(v))) } else { Err(ValidationError::custom( - Location::new(), - path, - value, t!("vscode.keywords.allow_comments.factory_error_invalid_type"), )) } @@ -60,15 +57,14 @@ impl JsonSchema for AllowCommentsKeyword { } } -impl Keyword for AllowCommentsKeyword { - fn validate<'i>( +impl<'i> Keyword<'i> for AllowCommentsKeyword { + fn validate( &self, _: &'i serde_json::Value, - _: &jsonschema::paths::LazyLocation, ) -> Result<(), ValidationError<'i>> { Ok(()) } - fn is_valid(&self, _: &serde_json::Value) -> bool { + fn is_valid(&self, _: &'i serde_json::Value) -> bool { true } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/allow_trailing_commas.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/allow_trailing_commas.rs index 69cc13133..b4e7a5daf 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/allow_trailing_commas.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/allow_trailing_commas.rs @@ -28,15 +28,12 @@ impl VSCodeKeywordDefinition for AllowTrailingCommasKeyword { fn keyword_factory<'a>( _parent: &'a serde_json::Map, value: &'a serde_json::Value, - path: Location, - ) -> Result, ValidationError<'a>> { + _path: Location, + ) -> Result Keyword<'instance>>, ValidationError<'a>> { if let Some(v) = value.as_bool() { Ok(Box::new(Self(v))) } else { Err(ValidationError::custom( - Location::new(), - path, - value, t!("vscode.keywords.allow_trailing_commas.factory_error_invalid_type"), )) } @@ -61,15 +58,14 @@ impl JsonSchema for AllowTrailingCommasKeyword { } } -impl Keyword for AllowTrailingCommasKeyword { - fn validate<'i>( +impl<'i> Keyword<'i> for AllowTrailingCommasKeyword { + fn validate( &self, _: &'i serde_json::Value, - _: &jsonschema::paths::LazyLocation, ) -> Result<(), jsonschema::ValidationError<'i>> { Ok(()) } - fn is_valid(&self, _: &serde_json::Value) -> bool { + fn is_valid(&self, _: &'i serde_json::Value) -> bool { true } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/completion_detail.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/completion_detail.rs index 0fe586c7d..4f2c5a5de 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/completion_detail.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/completion_detail.rs @@ -35,15 +35,12 @@ impl VSCodeKeywordDefinition for CompletionDetailKeyword { fn keyword_factory<'a>( _parent: &'a serde_json::Map, value: &'a serde_json::Value, - path: jsonschema::paths::Location, - ) -> Result, jsonschema::ValidationError<'a>> { + _path: jsonschema::paths::Location, + ) -> Result Keyword<'instance>>, jsonschema::ValidationError<'a>> { if let Some(v) = value.as_str() { Ok(Box::new(Self(v.to_string()))) } else { Err(ValidationError::custom( - Location::new(), - path, - value, t!("vscode.keywords.completion_detail.factory_error_invalid_type"), )) } @@ -67,15 +64,14 @@ impl JsonSchema for CompletionDetailKeyword { } } -impl Keyword for CompletionDetailKeyword { - fn validate<'i>( +impl<'i> Keyword<'i> for CompletionDetailKeyword { + fn validate( &self, _: &'i serde_json::Value, - _: &jsonschema::paths::LazyLocation, ) -> Result<(), jsonschema::ValidationError<'i>> { Ok(()) } - fn is_valid(&self, _: &serde_json::Value) -> bool { + fn is_valid(&self, _: &'i serde_json::Value) -> bool { true } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/default_snippets.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/default_snippets.rs index 2e6670046..9f487660e 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/default_snippets.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/default_snippets.rs @@ -118,14 +118,11 @@ impl VSCodeKeywordDefinition for DefaultSnippetsKeyword { fn keyword_factory<'a>( _parent: &'a serde_json::Map, value: &'a Value, - path: Location, - ) -> Result, ValidationError<'a>> { + _path: Location, + ) -> Result Keyword<'instance>>, ValidationError<'a>> { if let Some(v) = value.as_array() { if v.iter().any(|item| item.as_object().is_none()) { Err(ValidationError::custom( - Location::new(), - path, - value, format!( "{} {}", t!("vscode.keywords.default_snippets.factory_error_non_object_item"), @@ -136,9 +133,6 @@ impl VSCodeKeywordDefinition for DefaultSnippetsKeyword { Ok(Box::new(snippets)) } else { Err(ValidationError::custom( - Location::new(), - path, - value, format!( "{} {}", t!("vscode.keywords.default_snippets.factory_error_invalid_item"), @@ -148,9 +142,6 @@ impl VSCodeKeywordDefinition for DefaultSnippetsKeyword { } } else { Err(ValidationError::custom( - Location::new(), - path, - value, format!( "{} {}", t!("vscode.keywords.default_snippets.factory_error_not_array"), @@ -217,15 +208,14 @@ impl JsonSchema for DefaultSnippetsKeyword { } } -impl Keyword for DefaultSnippetsKeyword { - fn validate<'i>( +impl<'i> Keyword<'i> for DefaultSnippetsKeyword { + fn validate( &self, _: &'i serde_json::Value, - _: &jsonschema::paths::LazyLocation, ) -> Result<(), jsonschema::ValidationError<'i>> { Ok(()) } - fn is_valid(&self, _: &serde_json::Value) -> bool { + fn is_valid(&self, _: &'i serde_json::Value) -> bool { true } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/deprecation_message.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/deprecation_message.rs index 9badd6d28..32049f0c3 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/deprecation_message.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/deprecation_message.rs @@ -29,15 +29,12 @@ impl VSCodeKeywordDefinition for DeprecationMessageKeyword { fn keyword_factory<'a>( _parent: &'a serde_json::Map, value: &'a serde_json::Value, - path: Location, - ) -> Result, ValidationError<'a>> { + _path: Location, + ) -> Result Keyword<'instance>>, ValidationError<'a>> { if let Some(v) = value.as_str() { Ok(Box::new(Self(v.to_string()))) } else { Err(ValidationError::custom( - Location::new(), - path, - value, t!("vscode.keywords.deprecation_message.factory_error_invalid_type"), )) } @@ -61,15 +58,14 @@ impl JsonSchema for DeprecationMessageKeyword { } } -impl Keyword for DeprecationMessageKeyword { - fn validate<'i>( +impl<'i> Keyword<'i> for DeprecationMessageKeyword { + fn validate( &self, _: &'i serde_json::Value, - _: &jsonschema::paths::LazyLocation, ) -> Result<(), jsonschema::ValidationError<'i>> { Ok(()) } - fn is_valid(&self, _: &serde_json::Value) -> bool { + fn is_valid(&self, _: &'i serde_json::Value) -> bool { true } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/do_not_suggest.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/do_not_suggest.rs index aae5aa1cb..b496b39d3 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/do_not_suggest.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/do_not_suggest.rs @@ -28,15 +28,12 @@ impl VSCodeKeywordDefinition for DoNotSuggestKeyword { fn keyword_factory<'a>( _parent: &'a serde_json::Map, value: &'a serde_json::Value, - path: Location, - ) -> Result, ValidationError<'a>> { + _path: Location, + ) -> Result Keyword<'instance>>, ValidationError<'a>> { if let Some(v) = value.as_bool() { Ok(Box::new(Self(v))) } else { Err(ValidationError::custom( - Location::new(), - path, - value, t!("vscode.keywords.do_not_suggest.factory_error_invalid_type"), )) } @@ -61,15 +58,14 @@ impl JsonSchema for DoNotSuggestKeyword { } } -impl Keyword for DoNotSuggestKeyword { - fn validate<'i>( +impl<'i> Keyword<'i> for DoNotSuggestKeyword { + fn validate( &self, _: &'i serde_json::Value, - _: &jsonschema::paths::LazyLocation, ) -> Result<(), jsonschema::ValidationError<'i>> { Ok(()) } - fn is_valid(&self, _: &serde_json::Value) -> bool { + fn is_valid(&self, _: &'i serde_json::Value) -> bool { true } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/enum_descriptions.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/enum_descriptions.rs index 9f12d26a2..dc00e8c2d 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/enum_descriptions.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/enum_descriptions.rs @@ -40,8 +40,8 @@ impl VSCodeKeywordDefinition for EnumDescriptionsKeyword { fn keyword_factory<'a>( _parent: &'a serde_json::Map, value: &'a serde_json::Value, - path: Location, - ) -> Result, ValidationError<'a>> { + _path: Location, + ) -> Result Keyword<'instance>>, ValidationError<'a>> { if let Some(v) = value.as_array() { if v.iter().all(|item| item.as_str().is_some()) { Ok(Box::new(Self( @@ -49,9 +49,6 @@ impl VSCodeKeywordDefinition for EnumDescriptionsKeyword { ))) } else { Err(ValidationError::custom( - Location::new(), - path, - value, format!( "{} {}", t!("vscode.keywords.enum_descriptions.factory_error_non_string_item"), @@ -61,9 +58,6 @@ impl VSCodeKeywordDefinition for EnumDescriptionsKeyword { } } else { Err(ValidationError::custom( - Location::new(), - path, - value, format!( "{} {}", t!("vscode.keywords.enum_descriptions.factory_error_not_array"), @@ -94,15 +88,14 @@ impl JsonSchema for EnumDescriptionsKeyword { } } -impl Keyword for EnumDescriptionsKeyword { - fn validate<'i>( +impl<'i> Keyword<'i> for EnumDescriptionsKeyword { + fn validate( &self, _: &'i serde_json::Value, - _: &jsonschema::paths::LazyLocation, ) -> Result<(), jsonschema::ValidationError<'i>> { Ok(()) } - fn is_valid(&self, _: &serde_json::Value) -> bool { + fn is_valid(&self, _: &'i serde_json::Value) -> bool { true } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/enum_details.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/enum_details.rs index 5ff7e9ac1..0dabbe965 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/enum_details.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/enum_details.rs @@ -35,8 +35,8 @@ impl VSCodeKeywordDefinition for EnumDetailsKeyword { fn keyword_factory<'a>( _parent: &'a serde_json::Map, value: &'a serde_json::Value, - path: Location, - ) -> Result, ValidationError<'a>> { + _path: Location, + ) -> Result Keyword<'instance>>, ValidationError<'a>> { if let Some(v) = value.as_array() { if v.iter().all(|item| item.as_str().is_some()) { Ok(Box::new(Self( @@ -44,9 +44,6 @@ impl VSCodeKeywordDefinition for EnumDetailsKeyword { ))) } else { Err(ValidationError::custom( - Location::new(), - path, - value, format!( "{} {}", t!("vscode.keywords.enum_details.factory_error_non_string_item"), @@ -56,9 +53,6 @@ impl VSCodeKeywordDefinition for EnumDetailsKeyword { } } else { Err(ValidationError::custom( - Location::new(), - path, - value, format!( "{} {}", t!("vscode.keywords.enum_details.factory_error_not_array"), @@ -89,15 +83,14 @@ impl JsonSchema for EnumDetailsKeyword { } } -impl Keyword for EnumDetailsKeyword { - fn validate<'i>( +impl<'i> Keyword<'i> for EnumDetailsKeyword { + fn validate( &self, _: &'i serde_json::Value, - _: &jsonschema::paths::LazyLocation, ) -> Result<(), jsonschema::ValidationError<'i>> { Ok(()) } - fn is_valid(&self, _: &serde_json::Value) -> bool { + fn is_valid(&self, _: &'i serde_json::Value) -> bool { true } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/enum_sort_texts.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/enum_sort_texts.rs index 16f29329c..18f6231aa 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/enum_sort_texts.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/enum_sort_texts.rs @@ -42,8 +42,8 @@ impl VSCodeKeywordDefinition for EnumSortTextsKeyword { fn keyword_factory<'a>( _parent: &'a serde_json::Map, value: &'a serde_json::Value, - path: Location, - ) -> Result, ValidationError<'a>> { + _path: Location, + ) -> Result Keyword<'instance>>, ValidationError<'a>> { if let Some(v) = value.as_array() { if v.iter().all(|item| item.as_str().is_some()) { Ok(Box::new(Self( @@ -51,9 +51,6 @@ impl VSCodeKeywordDefinition for EnumSortTextsKeyword { ))) } else { Err(ValidationError::custom( - Location::new(), - path, - value, format!( "{} {}", t!("vscode.keywords.enum_sort_texts.factory_error_non_string_item"), @@ -63,9 +60,6 @@ impl VSCodeKeywordDefinition for EnumSortTextsKeyword { } } else { Err(ValidationError::custom( - Location::new(), - path, - value, format!( "{} {}", t!("vscode.keywords.enum_sort_texts.factory_error_not_array"), @@ -96,15 +90,14 @@ impl JsonSchema for EnumSortTextsKeyword { } } -impl Keyword for EnumSortTextsKeyword { - fn validate<'i>( +impl<'i> Keyword<'i> for EnumSortTextsKeyword { + fn validate( &self, _: &'i serde_json::Value, - _: &jsonschema::paths::LazyLocation, ) -> Result<(), jsonschema::ValidationError<'i>> { Ok(()) } - fn is_valid(&self, _: &serde_json::Value) -> bool { + fn is_valid(&self, _: &'i serde_json::Value) -> bool { true } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/error_message.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/error_message.rs index 2402a3811..1546a1274 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/error_message.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/error_message.rs @@ -51,15 +51,12 @@ impl VSCodeKeywordDefinition for ErrorMessageKeyword { fn keyword_factory<'a>( _parent: &'a serde_json::Map, value: &'a serde_json::Value, - path: Location, - ) -> Result, ValidationError<'a>> { + _path: Location, + ) -> Result Keyword<'instance>>, ValidationError<'a>> { if let Some(v) = value.as_str() { Ok(Box::new(Self(v.to_string()))) } else { Err(ValidationError::custom( - Location::new(), - path, - value, t!("vscode.keywords.error_message.factory_error_invalid_type"), )) } @@ -83,15 +80,14 @@ impl JsonSchema for ErrorMessageKeyword { } } -impl Keyword for ErrorMessageKeyword { - fn validate<'i>( +impl<'i> Keyword<'i> for ErrorMessageKeyword { + fn validate( &self, _: &'i serde_json::Value, - _: &jsonschema::paths::LazyLocation, ) -> Result<(), jsonschema::ValidationError<'i>> { Ok(()) } - fn is_valid(&self, _: &serde_json::Value) -> bool { + fn is_valid(&self, _: &'i serde_json::Value) -> bool { true } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/markdown_description.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/markdown_description.rs index 9070674bf..cc838ebe8 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/markdown_description.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/markdown_description.rs @@ -39,15 +39,12 @@ impl VSCodeKeywordDefinition for MarkdownDescriptionKeyword { fn keyword_factory<'a>( _parent: &'a serde_json::Map, value: &'a serde_json::Value, - path: Location, - ) -> Result, ValidationError<'a>> { + _path: Location, + ) -> Result Keyword<'instance>>, ValidationError<'a>> { if let Some(v) = value.as_str() { Ok(Box::new(Self(v.to_string()))) } else { Err(ValidationError::custom( - Location::new(), - path, - value, t!("vscode.keywords.markdown_description.factory_error_invalid_type"), )) } @@ -71,15 +68,14 @@ impl JsonSchema for MarkdownDescriptionKeyword { } } -impl Keyword for MarkdownDescriptionKeyword { - fn validate<'i>( +impl<'i> Keyword<'i> for MarkdownDescriptionKeyword { + fn validate( &self, _: &'i serde_json::Value, - _: &jsonschema::paths::LazyLocation, ) -> Result<(), jsonschema::ValidationError<'i>> { Ok(()) } - fn is_valid(&self, _: &serde_json::Value) -> bool { + fn is_valid(&self, _: &'i serde_json::Value) -> bool { true } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/markdown_enum_descriptions.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/markdown_enum_descriptions.rs index 2a86f28ab..1c1417451 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/markdown_enum_descriptions.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/markdown_enum_descriptions.rs @@ -36,8 +36,8 @@ impl VSCodeKeywordDefinition for MarkdownEnumDescriptionsKeyword { fn keyword_factory<'a>( _parent: &'a serde_json::Map, value: &'a serde_json::Value, - path: Location, - ) -> Result, ValidationError<'a>> { + _path: Location, + ) -> Result Keyword<'instance>>, ValidationError<'a>> { if let Some(v) = value.as_array() { if v.iter().all(|item| item.as_str().is_some()) { Ok(Box::new(Self( @@ -45,9 +45,6 @@ impl VSCodeKeywordDefinition for MarkdownEnumDescriptionsKeyword { ))) } else { Err(ValidationError::custom( - Location::new(), - path, - value, format!( "{} {}", t!("vscode.keywords.markdown_enum_descriptions.factory_error_non_string_item"), @@ -57,9 +54,6 @@ impl VSCodeKeywordDefinition for MarkdownEnumDescriptionsKeyword { } } else { Err(ValidationError::custom( - Location::new(), - path, - value, format!( "{} {}", t!("vscode.keywords.markdown_enum_descriptions.factory_error_not_array"), @@ -90,15 +84,14 @@ impl JsonSchema for MarkdownEnumDescriptionsKeyword { } } -impl Keyword for MarkdownEnumDescriptionsKeyword { - fn validate<'i>( +impl<'i> Keyword<'i> for MarkdownEnumDescriptionsKeyword { + fn validate( &self, _: &'i serde_json::Value, - _: &jsonschema::paths::LazyLocation, ) -> Result<(), jsonschema::ValidationError<'i>> { Ok(()) } - fn is_valid(&self, _: &serde_json::Value) -> bool { + fn is_valid(&self, _: &'i serde_json::Value) -> bool { true } } \ No newline at end of file diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/mod.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/mod.rs index 4485d7169..54d8ea582 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/mod.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/mod.rs @@ -3,7 +3,8 @@ #![allow(unused_imports)] -use jsonschema::{Keyword, Resource, ValidationError, ValidationOptions, paths::Location}; +use jsonschema::{Keyword, ValidationError, ValidationOptions, paths::Location}; +use referencing::Resource; use schemars::{JsonSchema, Schema, json_schema}; use serde_json::{Map, Value}; diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/pattern_error_message.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/pattern_error_message.rs index 958898234..790f1b0d4 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/pattern_error_message.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/pattern_error_message.rs @@ -32,15 +32,12 @@ impl VSCodeKeywordDefinition for PatternErrorMessageKeyword { fn keyword_factory<'a>( _parent: &'a serde_json::Map, value: &'a serde_json::Value, - path: Location, - ) -> Result, ValidationError<'a>> { + _path: Location, + ) -> Result Keyword<'instance>>, ValidationError<'a>> { if let Some(v) = value.as_str() { Ok(Box::new(Self(v.to_string()))) } else { Err(ValidationError::custom( - Location::new(), - path, - value, t!("vscode.keywords.pattern_error_message.factory_error_invalid_type"), )) } @@ -64,15 +61,14 @@ impl JsonSchema for PatternErrorMessageKeyword { } } -impl Keyword for PatternErrorMessageKeyword { - fn validate<'i>( +impl<'i> Keyword<'i> for PatternErrorMessageKeyword { + fn validate( &self, _: &'i serde_json::Value, - _: &jsonschema::paths::LazyLocation, ) -> Result<(), jsonschema::ValidationError<'i>> { Ok(()) } - fn is_valid(&self, _: &serde_json::Value) -> bool { + fn is_valid(&self, _: &'i serde_json::Value) -> bool { true } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/suggest_sort_text.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/suggest_sort_text.rs index 8ba74bbef..698e19989 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/suggest_sort_text.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/suggest_sort_text.rs @@ -44,15 +44,12 @@ impl VSCodeKeywordDefinition for SuggestSortTextKeyword { fn keyword_factory<'a>( _parent: &'a serde_json::Map, value: &'a serde_json::Value, - path: Location, - ) -> Result, ValidationError<'a>> { + _path: Location, + ) -> Result Keyword<'instance>>, ValidationError<'a>> { if let Some(v) = value.as_str() { Ok(Box::new(Self(v.to_string()))) } else { Err(ValidationError::custom( - Location::new(), - path, - value, t!("vscode.keywords.suggest_sort_text.factory_error_invalid_type"), )) } @@ -76,15 +73,11 @@ impl JsonSchema for SuggestSortTextKeyword { } } -impl Keyword for SuggestSortTextKeyword { - fn validate<'i>( - &self, - _: &'i serde_json::Value, - _: &jsonschema::paths::LazyLocation, - ) -> Result<(), jsonschema::ValidationError<'i>> { +impl<'i> Keyword<'i> for SuggestSortTextKeyword { + fn validate(&self, _: &'i serde_json::Value) -> Result<(), ValidationError<'i>> { Ok(()) } - fn is_valid(&self, _: &serde_json::Value) -> bool { + fn is_valid(&self, _: &'i serde_json::Value) -> bool { true } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs index 4c54597a9..0a57d2a67 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -use std::str::FromStr; - use jsonschema::ValidationOptions; use crate::vscode::keywords::{ @@ -130,107 +128,63 @@ impl VSCodeKeyword { /// For a more ergonomic way to register keywords, see [`VSCodeValidationOptionsExtensions`]. /// /// [`VSCodeValidationOptionsExtensions`]: crate::vscode::VSCodeValidationOptionsExtensions - pub fn register(self, options: ValidationOptions) -> ValidationOptions { + pub fn register<'i>(self, options: ValidationOptions<'i>) -> ValidationOptions<'i> { match self { Self::AllowComments => options.with_keyword( AllowCommentsKeyword::KEYWORD_NAME, AllowCommentsKeyword::keyword_factory - ).with_resource( - AllowCommentsKeyword::KEYWORD_ID, - AllowCommentsKeyword::default_schema_resource() ), - Self::AllowTrailingCommas => options.with_keyword( AllowTrailingCommasKeyword::KEYWORD_NAME, AllowTrailingCommasKeyword::keyword_factory - ).with_resource( - AllowTrailingCommasKeyword::KEYWORD_ID, - AllowTrailingCommasKeyword::default_schema_resource() ), - Self::CompletionDetail => options.with_keyword( CompletionDetailKeyword::KEYWORD_NAME, CompletionDetailKeyword::keyword_factory - ).with_resource( - CompletionDetailKeyword::KEYWORD_ID, - CompletionDetailKeyword::default_schema_resource() ), Self::DefaultSnippets => options.with_keyword( DefaultSnippetsKeyword::KEYWORD_NAME, DefaultSnippetsKeyword::keyword_factory - ).with_resource( - DefaultSnippetsKeyword::KEYWORD_ID, - DefaultSnippetsKeyword::default_schema_resource() ), Self::DeprecationMessage => options.with_keyword( DeprecationMessageKeyword::KEYWORD_NAME, DeprecationMessageKeyword::keyword_factory - ).with_resource( - DeprecationMessageKeyword::KEYWORD_ID, - DeprecationMessageKeyword::default_schema_resource() ), Self::DoNotSuggest => options.with_keyword( DoNotSuggestKeyword::KEYWORD_NAME, DoNotSuggestKeyword::keyword_factory - ).with_resource( - DoNotSuggestKeyword::KEYWORD_ID, - DoNotSuggestKeyword::default_schema_resource() ), Self::EnumDescriptions => options.with_keyword( EnumDescriptionsKeyword::KEYWORD_NAME, EnumDescriptionsKeyword::keyword_factory - ).with_resource( - EnumDescriptionsKeyword::KEYWORD_ID, - EnumDescriptionsKeyword::default_schema_resource() ), Self::EnumDetails => options.with_keyword( EnumDetailsKeyword::KEYWORD_NAME, EnumDetailsKeyword::keyword_factory - ).with_resource( - EnumDetailsKeyword::KEYWORD_ID, - EnumDetailsKeyword::default_schema_resource() ), Self::EnumSortTexts => options.with_keyword( EnumSortTextsKeyword::KEYWORD_NAME, EnumSortTextsKeyword::keyword_factory - ).with_resource( - EnumSortTextsKeyword::KEYWORD_ID, - EnumSortTextsKeyword::default_schema_resource() ), Self::ErrorMessage => options.with_keyword( ErrorMessageKeyword::KEYWORD_NAME, ErrorMessageKeyword::keyword_factory - ).with_resource( - ErrorMessageKeyword::KEYWORD_ID, - ErrorMessageKeyword::default_schema_resource() ), Self::MarkdownDescription => options.with_keyword( MarkdownDescriptionKeyword::KEYWORD_NAME, MarkdownDescriptionKeyword::keyword_factory - ).with_resource( - MarkdownDescriptionKeyword::KEYWORD_ID, - MarkdownDescriptionKeyword::default_schema_resource() ), Self::MarkdownEnumDescriptions => options.with_keyword( MarkdownEnumDescriptionsKeyword::KEYWORD_NAME, MarkdownEnumDescriptionsKeyword::keyword_factory - ).with_resource( - MarkdownEnumDescriptionsKeyword::KEYWORD_ID, - MarkdownEnumDescriptionsKeyword::default_schema_resource() ), Self::PatternErrorMessage => options.with_keyword( PatternErrorMessageKeyword::KEYWORD_NAME, PatternErrorMessageKeyword::keyword_factory - ).with_resource( - PatternErrorMessageKeyword::KEYWORD_ID, - PatternErrorMessageKeyword::default_schema_resource() ), Self::SuggestSortText => options.with_keyword( SuggestSortTextKeyword::KEYWORD_NAME, SuggestSortTextKeyword::keyword_factory - ).with_resource( - SuggestSortTextKeyword::KEYWORD_ID, - SuggestSortTextKeyword::default_schema_resource() ), } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword_definition.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword_definition.rs index c218dc904..b1d322653 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword_definition.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword_definition.rs @@ -1,15 +1,17 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -use jsonschema::{Keyword, Resource, ValidationError, paths::Location}; +use jsonschema::{Keyword, ValidationError, paths::Location}; +use referencing::Resource; use schemars::{JsonSchema, Schema, SchemaGenerator, generate::SchemaSettings, json_schema}; use serde_json::{Map, Value}; /// Defines a VS Code keyword for the [`jsonschema`] crate. /// -/// This trait requires the target type to implement both the [`JsonSchema`] and [`Keyword`] traits, -/// as this crate publishes both a vocabulary and meta schema for using the VS Code keywords. -pub trait VSCodeKeywordDefinition : JsonSchema + Keyword { +/// This trait requires the target type to implement both the [`JsonSchema`] and +/// [`Keyword`] traits, as this crate publishes both a vocabulary and meta schema for using +/// the VS Code keywords. +pub trait VSCodeKeywordDefinition : JsonSchema + for<'i> Keyword<'i> { /// Defines the property name for the keyword, like `markdownDescription`. const KEYWORD_NAME: &str; @@ -33,7 +35,7 @@ pub trait VSCodeKeywordDefinition : JsonSchema + Keyword { _parent: &'a Map, value: &'a Value, path: Location, - ) -> Result, ValidationError<'a>>; + ) -> Result Keyword<'instance>>, ValidationError<'a>>; /// Returns the default representation of the JSON Schema for the keyword. /// diff --git a/lib/dsc-lib-jsonschema/src/vscode/mod.rs b/lib/dsc-lib-jsonschema/src/vscode/mod.rs index 9b388b38d..c4efafe80 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/mod.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/mod.rs @@ -11,4 +11,4 @@ pub mod vocabulary; mod schema_extensions; pub use schema_extensions::VSCodeSchemaExtensions; mod validation_options_extensions; -pub use validation_options_extensions::VSCodeValidationOptionsExtensions; +pub use validation_options_extensions::{VSCodeValidationOptionsExtensions, VSCODE_DIALECT_REGISTRY}; diff --git a/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs b/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs index b9a81348f..0055146ef 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs @@ -1,35 +1,98 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +use std::sync::LazyLock; + use jsonschema::ValidationOptions; +use referencing::Registry; use crate::vscode::{ - dialect::{VSCodeDialect, VSCODE_DIALECT_SCHEMA_RESOURCE_CANONICAL}, - vocabulary::{VSCodeVocabulary, VSCODE_VOCABULARY_SCHEMA_RESOURCE_CANONICAL}, - keywords::VSCodeKeyword, + dialect::VSCodeDialect, + vocabulary::VSCodeVocabulary, + keywords::{ + VSCodeKeyword, + VSCodeKeywordDefinition, + AllowCommentsKeyword, + AllowTrailingCommasKeyword, + CompletionDetailKeyword, + DefaultSnippetsKeyword, + DeprecationMessageKeyword, + DoNotSuggestKeyword, + EnumDescriptionsKeyword, + EnumDetailsKeyword, + EnumSortTextsKeyword, + ErrorMessageKeyword, + MarkdownDescriptionKeyword, + MarkdownEnumDescriptionsKeyword, + PatternErrorMessageKeyword, + SuggestSortTextKeyword, + }, }; +/// A static registry containing all VS Code keyword schema resources, the vocabulary schema, +/// and the dialect meta schema. +/// +/// This registry is lazily initialized on first use and lives for the duration of the program. +/// It is used by the [`VSCodeValidationOptionsExtensions`] trait methods to register schema +/// resources with `with_registry()`. +pub static VSCODE_DIALECT_REGISTRY: LazyLock> = LazyLock::new(|| { + Registry::new() + .add(AllowCommentsKeyword::KEYWORD_ID, AllowCommentsKeyword::default_schema_resource()) + .expect("valid URI") + .add(AllowTrailingCommasKeyword::KEYWORD_ID, AllowTrailingCommasKeyword::default_schema_resource()) + .expect("valid URI") + .add(CompletionDetailKeyword::KEYWORD_ID, CompletionDetailKeyword::default_schema_resource()) + .expect("valid URI") + .add(DefaultSnippetsKeyword::KEYWORD_ID, DefaultSnippetsKeyword::default_schema_resource()) + .expect("valid URI") + .add(DeprecationMessageKeyword::KEYWORD_ID, DeprecationMessageKeyword::default_schema_resource()) + .expect("valid URI") + .add(DoNotSuggestKeyword::KEYWORD_ID, DoNotSuggestKeyword::default_schema_resource()) + .expect("valid URI") + .add(EnumDescriptionsKeyword::KEYWORD_ID, EnumDescriptionsKeyword::default_schema_resource()) + .expect("valid URI") + .add(EnumDetailsKeyword::KEYWORD_ID, EnumDetailsKeyword::default_schema_resource()) + .expect("valid URI") + .add(EnumSortTextsKeyword::KEYWORD_ID, EnumSortTextsKeyword::default_schema_resource()) + .expect("valid URI") + .add(ErrorMessageKeyword::KEYWORD_ID, ErrorMessageKeyword::default_schema_resource()) + .expect("valid URI") + .add(MarkdownDescriptionKeyword::KEYWORD_ID, MarkdownDescriptionKeyword::default_schema_resource()) + .expect("valid URI") + .add(MarkdownEnumDescriptionsKeyword::KEYWORD_ID, MarkdownEnumDescriptionsKeyword::default_schema_resource()) + .expect("valid URI") + .add(PatternErrorMessageKeyword::KEYWORD_ID, PatternErrorMessageKeyword::default_schema_resource()) + .expect("valid URI") + .add(SuggestSortTextKeyword::KEYWORD_ID, SuggestSortTextKeyword::default_schema_resource()) + .expect("valid URI") + .add(VSCodeVocabulary::SCHEMA_ID, VSCodeVocabulary::default_schema_resource()) + .expect("valid URI") + .add(VSCodeDialect::SCHEMA_ID, VSCodeDialect::default_schema_resource()) + .expect("valid URI") + .prepare() + .expect("valid registry") +}); + /// Defines extension methods to the [`jsonschema::ValidationOptions`] to simplify registering the /// VS Code [keywords], [vocabulary], and [dialect meta schema]. /// /// [keywords]: VSCodeKeyword /// [vocabulary]: VSCodeVocabulary /// [dialect meta schema]: VSCodeDialect -pub trait VSCodeValidationOptionsExtensions { +pub trait VSCodeValidationOptionsExtensions<'i> { /// Registers a single VS Code keyword for use with a [`jsonschema::Validator`]. /// - /// This function registers a specific VS Code keyword and the schema resource that defines it - /// with the [`with_keyword()`] and [`with_resource()`] builder methods. + /// This function registers a specific VS Code keyword with the [`with_keyword()`] builder + /// method and adds the [`VSCODE_DIALECT_REGISTRY`] containing all schema resources. /// /// [`with_keyword()`]: ValidationOptions::with_keyword - /// [`with_resource()`]: ValidationOptions::with_resource /// [`with_vscode_dialect()`]: VSCodeValidationOptionsExtensions::with_vscode_dialect /// [`with_vscode_vocabulary()`]: VSCodeValidationOptionsExtensions::with_vscode_vocabulary - fn with_vscode_keyword(self, keyword: VSCodeKeyword) -> ValidationOptions; + fn with_vscode_keyword(self, keyword: VSCodeKeyword) -> ValidationOptions<'i>; /// Registers every VS Code keyword for use with a [`jsonschema::Validator`]. /// - /// This function registers each of the VS Code keywords and the schema resources that define - /// them with the [`with_keyword()`] and [`with_resource()`] builder methods. + /// This function registers each of the VS Code keywords with the [`with_keyword()`] builder + /// method and adds the [`VSCODE_DIALECT_REGISTRY`] containing all schema resources. /// /// Use this function when you only want to register the VS Code vocabulary keywords. /// If you are using the VS Code vocabulary in your own meta schema dialect, use the @@ -37,14 +100,13 @@ pub trait VSCodeValidationOptionsExtensions { /// dialect directly, use the [`with_vscode_dialect()`] method instead. /// /// [`with_keyword()`]: ValidationOptions::with_keyword - /// [`with_resource()`]: ValidationOptions::with_resource /// [`with_vscode_dialect()`]: VSCodeValidationOptionsExtensions::with_vscode_dialect /// [`with_vscode_vocabulary()`]: VSCodeValidationOptionsExtensions::with_vscode_vocabulary - fn with_vscode_keywords(self) -> ValidationOptions; + fn with_vscode_keywords(self) -> ValidationOptions<'i>; /// Registers the VS Code completion keywords for use with a [`jsonschema::Validator`]. /// - /// This function registers the following VS Code Keywords and the schema resources that - /// define them with the [`with_keyword()`] and [`with_resource()`] builder methods: + /// This function registers the following VS Code keywords with the [`with_keyword()`] builder + /// method and adds the [`VSCODE_DIALECT_REGISTRY`] containing all schema resources: /// /// - [`completionDetail`] /// - [`defaultSnippets`] @@ -53,11 +115,6 @@ pub trait VSCodeValidationOptionsExtensions { /// - [`enumSortTexts`] /// - [`suggestSortText`] /// - /// Use this function when you only want to register a subset of VS Code vocabulary keywords. - /// If you are using the VS Code vocabulary in your own meta schema dialect, use the - /// [`with_vscode_vocabulary()`] method instead. If you are using the VS Code meta schema - /// dialect directly, use the [`with_vscode_dialect()`] method instead. - /// /// [`completionDetail`]: super::keywords::CompletionDetailKeyword /// [`defaultSnippets`]: super::keywords::DefaultSnippetsKeyword /// [`doNotSuggest`]: super::keywords::DoNotSuggestKeyword @@ -65,81 +122,60 @@ pub trait VSCodeValidationOptionsExtensions { /// [`enumSortTexts`]: super::keywords::EnumSortTextsKeyword /// [`suggestSortText`]: super::keywords::SuggestSortTextKeyword /// [`with_keyword()`]: ValidationOptions::with_keyword - /// [`with_resource()`]: ValidationOptions::with_resource /// [`with_vscode_dialect()`]: VSCodeValidationOptionsExtensions::with_vscode_dialect /// [`with_vscode_vocabulary()`]: VSCodeValidationOptionsExtensions::with_vscode_vocabulary - fn with_vscode_completion_keywords(self) -> ValidationOptions; + fn with_vscode_completion_keywords(self) -> ValidationOptions<'i>; /// Registers the VS Code documentation keywords for use with a [`jsonschema::Validator`]. /// - /// This function registers the following VS Code Keywords and the schema resources that - /// define them with the [`with_keyword()`] and [`with_resource()`] builder methods: + /// This function registers the following VS Code keywords with the [`with_keyword()`] builder + /// method and adds the [`VSCODE_DIALECT_REGISTRY`] containing all schema resources: /// /// - [`deprecationMessageKeyword`] /// - [`enumDescriptionsKeyword`] /// - [`markdownDescriptionKeyword`] /// - [`markdownEnumDescriptionsKeyword`] /// - /// Use this function when you only want to register a subset of VS Code vocabulary keywords. - /// If you are using the VS Code vocabulary in your own meta schema dialect, use the - /// [`with_vscode_vocabulary()`] method instead. If you are using the VS Code meta schema - /// dialect directly, use the [`with_vscode_dialect()`] method instead. - /// /// [`deprecationMessageKeyword`]: super::keywords::DeprecationMessageKeyword /// [`enumDescriptionsKeyword`]: super::keywords::EnumDescriptionsKeyword /// [`markdownDescriptionKeyword`]: super::keywords::MarkdownDescriptionKeyword /// [`markdownEnumDescriptionsKeyword`]: super::keywords::MarkdownEnumDescriptionsKeyword - /// [`enumSortTexts`]: super::keywords::EnumSortTextsKeyword - /// [`suggestSortText`]: super::keywords::SuggestSortTextKeyword /// [`with_keyword()`]: ValidationOptions::with_keyword - /// [`with_resource()`]: ValidationOptions::with_resource /// [`with_vscode_dialect()`]: VSCodeValidationOptionsExtensions::with_vscode_dialect /// [`with_vscode_vocabulary()`]: VSCodeValidationOptionsExtensions::with_vscode_vocabulary - fn with_vscode_documentation_keywords(self) -> ValidationOptions; + fn with_vscode_documentation_keywords(self) -> ValidationOptions<'i>; /// Registers the VS Code error messaging keywords for use with a [`jsonschema::Validator`]. /// - /// This function registers the following VS Code Keywords and the schema resources that - /// define them with the [`with_keyword()`] and [`with_resource()`] builder methods: + /// This function registers the following VS Code keywords with the [`with_keyword()`] builder + /// method and adds the [`VSCODE_DIALECT_REGISTRY`] containing all schema resources: /// /// - [`errorMessageKeyword`] /// - [`patternErrorMessageKeyword`] /// - /// Use this function when you only want to register a subset of VS Code vocabulary keywords. - /// If you are using the VS Code vocabulary in your own meta schema dialect, use the - /// [`with_vscode_vocabulary()`] method instead. If you are using the VS Code meta schema - /// dialect directly, use the [`with_vscode_dialect()`] method instead. - /// /// [`errorMessageKeyword`]: super::keywords::ErrorMessageKeyword /// [`patternErrorMessageKeyword`]: super::keywords::PatternErrorMessageKeyword /// [`with_keyword()`]: ValidationOptions::with_keyword - /// [`with_resource()`]: ValidationOptions::with_resource /// [`with_vscode_dialect()`]: VSCodeValidationOptionsExtensions::with_vscode_dialect /// [`with_vscode_vocabulary()`]: VSCodeValidationOptionsExtensions::with_vscode_vocabulary - fn with_vscode_error_keywords(self) -> ValidationOptions; + fn with_vscode_error_keywords(self) -> ValidationOptions<'i>; /// Registers the VS Code parsing rules keywords for use with a [`jsonschema::Validator`]. /// - /// This function registers the following VS Code Keywords and the schema resources that - /// define them with the [`with_keyword()`] and [`with_resource()`] builder methods: + /// This function registers the following VS Code keywords with the [`with_keyword()`] builder + /// method and adds the [`VSCODE_DIALECT_REGISTRY`] containing all schema resources: /// /// - [`allowCommentsKeyword`] /// - [`allowTrailingCommasKeyword`] /// - /// Use this function when you only want to register a subset of VS Code vocabulary keywords. - /// If you are using the VS Code vocabulary in your own meta schema dialect, use the - /// [`with_vscode_vocabulary()`] method instead. If you are using the VS Code meta schema - /// dialect directly, use the [`with_vscode_dialect()`] method instead. - /// /// [`allowCommentsKeyword`]: super::keywords::AllowCommentsKeyword /// [`allowTrailingCommasKeyword`]: super::keywords::AllowTrailingCommasKeyword /// [`with_keyword()`]: ValidationOptions::with_keyword - /// [`with_resource()`]: ValidationOptions::with_resource /// [`with_vscode_dialect()`]: VSCodeValidationOptionsExtensions::with_vscode_dialect /// [`with_vscode_vocabulary()`]: VSCodeValidationOptionsExtensions::with_vscode_vocabulary - fn with_vscode_parsing_keywords(self) -> ValidationOptions; + fn with_vscode_parsing_keywords(self) -> ValidationOptions<'i>; /// Registers the VS Code vocabulary and keywords for use with a [`jsonschema::Validator`]. /// - /// This function registers each of the VS Code keywords and the schema resources that define - /// them with the [`with_keyword()`] and [`with_resource()`] builder methods. It also registers - /// the canonical form of the [vocabulary schema] as a schema resource. + /// This function registers each of the VS Code keywords with the [`with_keyword()`] builder + /// method and adds the [`VSCODE_DIALECT_REGISTRY`] containing all schema resources including + /// the vocabulary schema. /// /// This is a convenience method for registering the vocabulary and keywords. You don't need to /// separately add the keywords or schema resources. Use this convenience method when you are @@ -149,16 +185,15 @@ pub trait VSCodeValidationOptionsExtensions { /// own purposes, use the [`with_vscode_dialect()`] method instead. /// /// [`with_keyword()`]: ValidationOptions::with_keyword - /// [`with_resource()`]: ValidationOptions::with_resource /// [vocabulary schema]: super::vocabulary::VSCODE_VOCABULARY_SCHEMA_CANONICAL /// [`with_vscode_dialect()`]: VSCodeValidationOptionsExtensions::with_vscode_dialect - fn with_vscode_vocabulary(self) -> ValidationOptions; + fn with_vscode_vocabulary(self) -> ValidationOptions<'i>; /// Registers the VS Code dialect meta schema, vocabulary, and keywords for use with a /// [`jsonschema::Validator`]. /// - /// This function registers each of the VS Code keywords and the schema resources that define - /// them with the [`with_keyword()`] and [`with_resource()`] builder methods. It also registers - /// the canonical form of the [vocabulary schema] and [dialect meta schema] as schema resources. + /// This function registers each of the VS Code keywords with the [`with_keyword()`] builder + /// method and adds the [`VSCODE_DIALECT_REGISTRY`] containing all schema resources including + /// the vocabulary schema and dialect meta schema. /// /// This is a convenience method for registering the meta schema, vocabulary, and keywords /// together. You don't need to separately add the keywords or schema resources. Use this @@ -168,19 +203,20 @@ pub trait VSCodeValidationOptionsExtensions { /// [`with_vscode_vocabulary()`] method instead. /// /// [`with_keyword()`]: ValidationOptions::with_keyword - /// [`with_resource()`]: ValidationOptions::with_resource /// [vocabulary schema]: super::vocabulary::VSCODE_VOCABULARY_SCHEMA_CANONICAL /// [dialect meta schema]: super::dialect::VSCODE_DIALECT_SCHEMA_CANONICAL /// [`with_vscode_vocabulary()`]: VSCodeValidationOptionsExtensions::with_vscode_vocabulary - fn with_vscode_dialect(self) -> ValidationOptions; + fn with_vscode_dialect(self) -> ValidationOptions<'i>; } -impl VSCodeValidationOptionsExtensions for ValidationOptions { - fn with_vscode_keyword(self, keyword: VSCodeKeyword) -> Self { +impl<'i> VSCodeValidationOptionsExtensions<'i> for ValidationOptions<'i> { + fn with_vscode_keyword(self, keyword: VSCodeKeyword) -> ValidationOptions<'i> { keyword.register(self) + .with_registry(&VSCODE_DIALECT_REGISTRY) } - fn with_vscode_keywords(self) -> Self { + fn with_vscode_keywords(self) -> ValidationOptions<'i> { self + .with_registry(&VSCODE_DIALECT_REGISTRY) .with_vscode_keyword(VSCodeKeyword::AllowComments) .with_vscode_keyword(VSCodeKeyword::AllowTrailingCommas) .with_vscode_keyword(VSCodeKeyword::CompletionDetail) @@ -196,8 +232,9 @@ impl VSCodeValidationOptionsExtensions for ValidationOptions { .with_vscode_keyword(VSCodeKeyword::PatternErrorMessage) .with_vscode_keyword(VSCodeKeyword::SuggestSortText) } - fn with_vscode_completion_keywords(self) -> Self { + fn with_vscode_completion_keywords(self) -> ValidationOptions<'i> { self + .with_registry(&VSCODE_DIALECT_REGISTRY) .with_vscode_keyword(VSCodeKeyword::CompletionDetail) .with_vscode_keyword(VSCodeKeyword::DefaultSnippets) .with_vscode_keyword(VSCodeKeyword::DoNotSuggest) @@ -205,37 +242,30 @@ impl VSCodeValidationOptionsExtensions for ValidationOptions { .with_vscode_keyword(VSCodeKeyword::EnumSortTexts) .with_vscode_keyword(VSCodeKeyword::SuggestSortText) } - fn with_vscode_documentation_keywords(self) -> ValidationOptions { + fn with_vscode_documentation_keywords(self) -> ValidationOptions<'i> { self + .with_registry(&VSCODE_DIALECT_REGISTRY) .with_vscode_keyword(VSCodeKeyword::DeprecationMessage) .with_vscode_keyword(VSCodeKeyword::EnumDescriptions) .with_vscode_keyword(VSCodeKeyword::MarkdownDescription) .with_vscode_keyword(VSCodeKeyword::MarkdownEnumDescriptions) } - fn with_vscode_error_keywords(self) -> ValidationOptions { + fn with_vscode_error_keywords(self) -> ValidationOptions<'i> { self + .with_registry(&VSCODE_DIALECT_REGISTRY) .with_vscode_keyword(VSCodeKeyword::ErrorMessage) .with_vscode_keyword(VSCodeKeyword::PatternErrorMessage) } - fn with_vscode_parsing_keywords(self) -> ValidationOptions { + fn with_vscode_parsing_keywords(self) -> ValidationOptions<'i> { self + .with_registry(&VSCODE_DIALECT_REGISTRY) .with_vscode_keyword(VSCodeKeyword::AllowComments) .with_vscode_keyword(VSCodeKeyword::AllowTrailingCommas) } - fn with_vscode_vocabulary(self) -> ValidationOptions { - self - .with_vscode_keywords() - .with_resource( - VSCodeVocabulary::SCHEMA_ID, - (**VSCODE_VOCABULARY_SCHEMA_RESOURCE_CANONICAL).clone() - ) + fn with_vscode_vocabulary(self) -> ValidationOptions<'i> { + self.with_vscode_keywords() } - fn with_vscode_dialect(self) -> ValidationOptions { - self - .with_vscode_vocabulary() - .with_resource( - VSCodeDialect::SCHEMA_ID, - (**VSCODE_DIALECT_SCHEMA_RESOURCE_CANONICAL).clone() - ) + fn with_vscode_dialect(self) -> ValidationOptions<'i> { + self.with_vscode_keywords() } } diff --git a/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs b/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs index 0c0ce5414..db273cb1d 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs @@ -3,7 +3,7 @@ use std::sync::{Arc, LazyLock}; -use jsonschema::Resource; +use referencing::Resource; use rust_i18n::t; use schemars::{JsonSchema, Schema, SchemaGenerator, generate::SchemaSettings, json_schema}; @@ -195,6 +195,16 @@ impl VSCodeVocabulary { pub fn schema_resource_canonical(generator: &mut schemars::SchemaGenerator) -> Resource { Resource::from_contents(Self::json_schema_canonical(generator).to_value()) } + + /// Returns the default canonical schema for the vocabulary as a [`Resource`]. + /// + /// This is a convenience method that uses the default [`SchemaGenerator`] settings. + #[must_use] + pub fn default_schema_resource() -> Resource { + use schemars::{SchemaGenerator, generate::SchemaSettings}; + let generator = &mut SchemaGenerator::new(SchemaSettings::draft2020_12()); + Self::schema_resource_canonical(generator) + } } impl JsonSchema for VSCodeVocabulary { From bc89a7f162dbaca1da5c7b912e697a0a1176e8b1 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Mon, 27 Jul 2026 12:27:53 -0700 Subject: [PATCH 2/7] Fix clippy lint and address PR review feedback - Elide unnecessary lifetime in VSCodeKeyword::register() to satisfy clippy::elidable_lifetime_names (pedantic lint) - Remove redundant with_registry() calls in multi-keyword extension methods since with_vscode_keyword() already registers the registry - Update register() docs to clarify it only registers the keyword factory, not schema resources, and point callers to the extension trait and VSCODE_DIALECT_REGISTRY for full resource registration Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../src/vscode/keywords/vscode_keyword.rs | 17 ++++++++++------- .../src/vscode/validation_options_extensions.rs | 5 ----- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs index 0a57d2a67..9064523cd 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs @@ -119,16 +119,19 @@ impl VSCodeKeyword { Self::SuggestSortText => SuggestSortTextKeyword::KEYWORD_NAME, } } - /// Registers the keyword with an instance of [`ValidationOptions`] from the `jsonschema` - /// crate. + /// Registers the keyword factory with an instance of [`ValidationOptions`] from the + /// `jsonschema` crate. /// - /// This convenience method enables you to quickly add keywords to the validator. However, - /// it doesn't follow the builder pattern typically used with [`ValidationOptions`]. - /// - /// For a more ergonomic way to register keywords, see [`VSCodeValidationOptionsExtensions`]. + /// This method only registers the keyword factory itself. It does **not** register the + /// schema resources (keyword `$id` schemas, vocabulary, or dialect meta schema) needed for + /// `$ref` resolution. To also register schema resources, use the + /// [`VSCodeValidationOptionsExtensions`] trait methods (e.g., [`with_vscode_keyword()`]), + /// which handle both keyword factories and the [`VSCODE_DIALECT_REGISTRY`]. /// /// [`VSCodeValidationOptionsExtensions`]: crate::vscode::VSCodeValidationOptionsExtensions - pub fn register<'i>(self, options: ValidationOptions<'i>) -> ValidationOptions<'i> { + /// [`with_vscode_keyword()`]: crate::vscode::VSCodeValidationOptionsExtensions::with_vscode_keyword + /// [`VSCODE_DIALECT_REGISTRY`]: crate::vscode::VSCODE_DIALECT_REGISTRY + pub fn register(self, options: ValidationOptions<'_>) -> ValidationOptions<'_> { match self { Self::AllowComments => options.with_keyword( AllowCommentsKeyword::KEYWORD_NAME, diff --git a/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs b/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs index 0055146ef..0c4d49ae4 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs @@ -216,7 +216,6 @@ impl<'i> VSCodeValidationOptionsExtensions<'i> for ValidationOptions<'i> { } fn with_vscode_keywords(self) -> ValidationOptions<'i> { self - .with_registry(&VSCODE_DIALECT_REGISTRY) .with_vscode_keyword(VSCodeKeyword::AllowComments) .with_vscode_keyword(VSCodeKeyword::AllowTrailingCommas) .with_vscode_keyword(VSCodeKeyword::CompletionDetail) @@ -234,7 +233,6 @@ impl<'i> VSCodeValidationOptionsExtensions<'i> for ValidationOptions<'i> { } fn with_vscode_completion_keywords(self) -> ValidationOptions<'i> { self - .with_registry(&VSCODE_DIALECT_REGISTRY) .with_vscode_keyword(VSCodeKeyword::CompletionDetail) .with_vscode_keyword(VSCodeKeyword::DefaultSnippets) .with_vscode_keyword(VSCodeKeyword::DoNotSuggest) @@ -244,7 +242,6 @@ impl<'i> VSCodeValidationOptionsExtensions<'i> for ValidationOptions<'i> { } fn with_vscode_documentation_keywords(self) -> ValidationOptions<'i> { self - .with_registry(&VSCODE_DIALECT_REGISTRY) .with_vscode_keyword(VSCodeKeyword::DeprecationMessage) .with_vscode_keyword(VSCodeKeyword::EnumDescriptions) .with_vscode_keyword(VSCodeKeyword::MarkdownDescription) @@ -252,13 +249,11 @@ impl<'i> VSCodeValidationOptionsExtensions<'i> for ValidationOptions<'i> { } fn with_vscode_error_keywords(self) -> ValidationOptions<'i> { self - .with_registry(&VSCODE_DIALECT_REGISTRY) .with_vscode_keyword(VSCodeKeyword::ErrorMessage) .with_vscode_keyword(VSCodeKeyword::PatternErrorMessage) } fn with_vscode_parsing_keywords(self) -> ValidationOptions<'i> { self - .with_registry(&VSCODE_DIALECT_REGISTRY) .with_vscode_keyword(VSCodeKeyword::AllowComments) .with_vscode_keyword(VSCodeKeyword::AllowTrailingCommas) } From 5c9b1a916efb37f9c8541451aa4e5a0f3431f6a7 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Mon, 27 Jul 2026 12:39:56 -0700 Subject: [PATCH 3/7] Address PR feedback: explicit lifetime and dialect delegation - Use explicit lifetime on register() for public API clarity, with clippy allow attribute for elidable_lifetime_names - Delegate with_vscode_dialect() to with_vscode_vocabulary() instead of with_vscode_keywords() to match the semantic intent chain Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs | 3 ++- .../src/vscode/validation_options_extensions.rs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs index 9064523cd..dc62841b6 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs @@ -131,7 +131,8 @@ impl VSCodeKeyword { /// [`VSCodeValidationOptionsExtensions`]: crate::vscode::VSCodeValidationOptionsExtensions /// [`with_vscode_keyword()`]: crate::vscode::VSCodeValidationOptionsExtensions::with_vscode_keyword /// [`VSCODE_DIALECT_REGISTRY`]: crate::vscode::VSCODE_DIALECT_REGISTRY - pub fn register(self, options: ValidationOptions<'_>) -> ValidationOptions<'_> { + #[allow(clippy::elidable_lifetime_names)] + pub fn register<'i>(self, options: ValidationOptions<'i>) -> ValidationOptions<'i> { match self { Self::AllowComments => options.with_keyword( AllowCommentsKeyword::KEYWORD_NAME, diff --git a/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs b/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs index 0c4d49ae4..21386bfcb 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs @@ -261,6 +261,6 @@ impl<'i> VSCodeValidationOptionsExtensions<'i> for ValidationOptions<'i> { self.with_vscode_keywords() } fn with_vscode_dialect(self) -> ValidationOptions<'i> { - self.with_vscode_keywords() + self.with_vscode_vocabulary() } } From 5c0b05d5bde27a87f6f360beabfba57c60a4c4fa Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Mon, 27 Jul 2026 13:54:49 -0700 Subject: [PATCH 4/7] Fix outdated doc references and add test coverage - Replace stale with_resource()/with_resources() doc references with with_registry() in vocabulary.rs and dialect.rs - Add tests for VSCODE_DIALECT_REGISTRY verifying all 16 resources (14 keywords + vocabulary + dialect) are registered - Add tests for VSCodeKeyword::register() standalone usage - Add tests for default_schema_resource() on VSCodeDialect and VSCodeVocabulary verifying correct and canonical form Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../src/tests/vscode/dialect.rs | 25 +++ .../src/tests/vscode/mod.rs | 1 + .../src/tests/vscode/vocabulary.rs | 25 +++ .../tests/vscode/vscode_dialect_registry.rs | 143 ++++++++++++++++++ lib/dsc-lib-jsonschema/src/vscode/dialect.rs | 24 +-- .../src/vscode/vocabulary.rs | 24 +-- 6 files changed, 210 insertions(+), 32 deletions(-) create mode 100644 lib/dsc-lib-jsonschema/src/tests/vscode/vscode_dialect_registry.rs diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/dialect.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/dialect.rs index c90a9a588..648076893 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/dialect.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/dialect.rs @@ -99,4 +99,29 @@ ); } } + #[cfg(test)] mod default_schema_resource { + use crate::vscode::dialect::VSCodeDialect; + + #[test] fn does_not_panic() { + let _ = VSCodeDialect::default_schema_resource(); + } + + #[test] fn returns_resource_with_correct_id() { + let resource = VSCodeDialect::default_schema_resource(); + let contents = resource.contents(); + let id = contents.get("$id").and_then(serde_json::Value::as_str); + + assert_eq!(id, Some(VSCodeDialect::SCHEMA_ID)); + } + + #[test] fn returns_canonical_form_without_bundled_defs() { + let resource = VSCodeDialect::default_schema_resource(); + let contents = resource.contents(); + let has_defs = contents.get("$defs") + .and_then(serde_json::Value::as_object) + .is_some_and(|defs| !defs.is_empty()); + + assert!(!has_defs, "default_schema_resource should return canonical form without bundled $defs"); + } + } } diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/mod.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/mod.rs index 283df1f7f..a5d8c84c4 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/mod.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/mod.rs @@ -9,3 +9,4 @@ #[cfg(test)] mod transforms; #[cfg(test)] mod validation_options_extensions; #[cfg(test)] mod vocabulary; +#[cfg(test)] mod vscode_dialect_registry; diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/vocabulary.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/vocabulary.rs index c53caf7cf..16719a422 100644 --- a/lib/dsc-lib-jsonschema/src/tests/vscode/vocabulary.rs +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/vocabulary.rs @@ -99,4 +99,29 @@ ); } } + #[cfg(test)] mod default_schema_resource { + use crate::vscode::vocabulary::VSCodeVocabulary; + + #[test] fn does_not_panic() { + let _ = VSCodeVocabulary::default_schema_resource(); + } + + #[test] fn returns_resource_with_correct_id() { + let resource = VSCodeVocabulary::default_schema_resource(); + let contents = resource.contents(); + let id = contents.get("$id").and_then(serde_json::Value::as_str); + + assert_eq!(id, Some(VSCodeVocabulary::SCHEMA_ID)); + } + + #[test] fn returns_canonical_form_without_bundled_defs() { + let resource = VSCodeVocabulary::default_schema_resource(); + let contents = resource.contents(); + let has_defs = contents.get("$defs") + .and_then(serde_json::Value::as_object) + .is_some_and(|defs| !defs.is_empty()); + + assert!(!has_defs, "default_schema_resource should return canonical form without bundled $defs"); + } + } } diff --git a/lib/dsc-lib-jsonschema/src/tests/vscode/vscode_dialect_registry.rs b/lib/dsc-lib-jsonschema/src/tests/vscode/vscode_dialect_registry.rs new file mode 100644 index 000000000..cfa636a09 --- /dev/null +++ b/lib/dsc-lib-jsonschema/src/tests/vscode/vscode_dialect_registry.rs @@ -0,0 +1,143 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#[allow(non_snake_case)] +#[cfg(test)] mod VSCODE_DIALECT_REGISTRY { + use crate::vscode::{ + VSCODE_DIALECT_REGISTRY, + dialect::VSCodeDialect, + vocabulary::VSCodeVocabulary, + keywords::{ + VSCodeKeywordDefinition, + AllowCommentsKeyword, + AllowTrailingCommasKeyword, + CompletionDetailKeyword, + DefaultSnippetsKeyword, + DeprecationMessageKeyword, + DoNotSuggestKeyword, + EnumDescriptionsKeyword, + EnumDetailsKeyword, + EnumSortTextsKeyword, + ErrorMessageKeyword, + MarkdownDescriptionKeyword, + MarkdownEnumDescriptionsKeyword, + PatternErrorMessageKeyword, + SuggestSortTextKeyword, + }, + }; + + #[test] fn initializes_without_panic() { + let _ = &*VSCODE_DIALECT_REGISTRY; + } + + #[test] fn contains_dialect_schema() { + assert!( + VSCODE_DIALECT_REGISTRY.contains_resource(VSCodeDialect::SCHEMA_ID), + "Registry should contain the dialect meta schema" + ); + } + + #[test] fn contains_vocabulary_schema() { + assert!( + VSCODE_DIALECT_REGISTRY.contains_resource(VSCodeVocabulary::SCHEMA_ID), + "Registry should contain the vocabulary schema" + ); + } + + #[test] fn contains_allow_comments_keyword_schema() { + assert!(VSCODE_DIALECT_REGISTRY.contains_resource(AllowCommentsKeyword::KEYWORD_ID)); + } + + #[test] fn contains_allow_trailing_commas_keyword_schema() { + assert!(VSCODE_DIALECT_REGISTRY.contains_resource(AllowTrailingCommasKeyword::KEYWORD_ID)); + } + + #[test] fn contains_completion_detail_keyword_schema() { + assert!(VSCODE_DIALECT_REGISTRY.contains_resource(CompletionDetailKeyword::KEYWORD_ID)); + } + + #[test] fn contains_default_snippets_keyword_schema() { + assert!(VSCODE_DIALECT_REGISTRY.contains_resource(DefaultSnippetsKeyword::KEYWORD_ID)); + } + + #[test] fn contains_deprecation_message_keyword_schema() { + assert!(VSCODE_DIALECT_REGISTRY.contains_resource(DeprecationMessageKeyword::KEYWORD_ID)); + } + + #[test] fn contains_do_not_suggest_keyword_schema() { + assert!(VSCODE_DIALECT_REGISTRY.contains_resource(DoNotSuggestKeyword::KEYWORD_ID)); + } + + #[test] fn contains_enum_descriptions_keyword_schema() { + assert!(VSCODE_DIALECT_REGISTRY.contains_resource(EnumDescriptionsKeyword::KEYWORD_ID)); + } + + #[test] fn contains_enum_details_keyword_schema() { + assert!(VSCODE_DIALECT_REGISTRY.contains_resource(EnumDetailsKeyword::KEYWORD_ID)); + } + + #[test] fn contains_enum_sort_texts_keyword_schema() { + assert!(VSCODE_DIALECT_REGISTRY.contains_resource(EnumSortTextsKeyword::KEYWORD_ID)); + } + + #[test] fn contains_error_message_keyword_schema() { + assert!(VSCODE_DIALECT_REGISTRY.contains_resource(ErrorMessageKeyword::KEYWORD_ID)); + } + + #[test] fn contains_markdown_description_keyword_schema() { + assert!(VSCODE_DIALECT_REGISTRY.contains_resource(MarkdownDescriptionKeyword::KEYWORD_ID)); + } + + #[test] fn contains_markdown_enum_descriptions_keyword_schema() { + assert!(VSCODE_DIALECT_REGISTRY.contains_resource(MarkdownEnumDescriptionsKeyword::KEYWORD_ID)); + } + + #[test] fn contains_pattern_error_message_keyword_schema() { + assert!(VSCODE_DIALECT_REGISTRY.contains_resource(PatternErrorMessageKeyword::KEYWORD_ID)); + } + + #[test] fn contains_suggest_sort_text_keyword_schema() { + assert!(VSCODE_DIALECT_REGISTRY.contains_resource(SuggestSortTextKeyword::KEYWORD_ID)); + } +} + +#[allow(non_snake_case)] +#[cfg(test)] mod VSCodeKeyword_register { + use jsonschema::Validator; + use pretty_assertions::assert_eq; + use serde_json::json; + + use crate::vscode::{ + VSCODE_DIALECT_REGISTRY, + keywords::{VSCodeKeyword, VSCodeKeywordDefinition, AllowCommentsKeyword}, + }; + + #[test] fn registers_keyword_factory_without_registry() { + // register() alone adds the keyword factory but not the registry, + // so a schema using the keyword name directly (not $ref) should work + let result = Validator::options() + .with_keyword( + AllowCommentsKeyword::KEYWORD_NAME, + AllowCommentsKeyword::keyword_factory + ) + .build(&json!({ + "allowComments": true + })); + + assert!(result.is_ok()); + } + + #[test] fn keyword_validates_with_register_and_registry() { + // register() + with_registry() together should allow $ref-based schemas + let validator = VSCodeKeyword::AllowComments.register( + Validator::options() + ) + .with_registry(&VSCODE_DIALECT_REGISTRY) + .build(&json!({ + "$ref": AllowCommentsKeyword::KEYWORD_ID + })).unwrap(); + + assert_eq!(validator.is_valid(&json!("invalid")), false); + assert_eq!(validator.is_valid(&json!(true)), true); + } +} diff --git a/lib/dsc-lib-jsonschema/src/vscode/dialect.rs b/lib/dsc-lib-jsonschema/src/vscode/dialect.rs index db499ca54..ab85c918f 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/dialect.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/dialect.rs @@ -118,8 +118,7 @@ impl VSCodeDialect { } /// Retrieves the bundled form of the meta schema as a [`Resource`] so you can include - /// it in the registered resources for a [`jsonschema::Validator`] using the [`with_resource()`] - /// or [`with_resources()`] methods on the [`jsonschema::ValidationOptions`] builder. + /// it in the registered resources for a [`jsonschema::Validator`] using the [`with_registry()`] method on [`jsonschema::ValidationOptions`]. /// /// The bundled form presents the meta schema as a compound schema document with the VS Code /// vocabulary and keyword schemas included under the `$defs` keyword. Use this form of the @@ -143,15 +142,13 @@ impl VSCodeDialect { /// checks for this failure mode. /// /// [`schema_resource_canonical()`]: Self::schema_resource_canonical - /// [`with_resource()`]: jsonschema::ValidationOptions::with_resource - /// [`with_resources()`]: jsonschema::ValidationOptions::with_resources + /// [`with_registry()`]: jsonschema::ValidationOptions::with_registry pub fn schema_resource_bundled(generator: &mut schemars::SchemaGenerator) -> Resource { Resource::from_contents(Self::json_schema(generator).to_value()) } /// Retrieves the bundled form of the meta schema as a [`Resource`] so you can include - /// it in the registered resources for a [`jsonschema::Validator`] using the [`with_resource()`] - /// or [`with_resources()`] methods on the [`jsonschema::ValidationOptions`] builder. + /// it in the registered resources for a [`jsonschema::Validator`] using the [`with_registry()`] method on [`jsonschema::ValidationOptions`]. /// /// The canonical form presents the meta schema without bundling the VS Code vocabulary or /// keyword schemas under the `$defs` keyword. Use this form of the schema when you can rely @@ -176,8 +173,7 @@ impl VSCodeDialect { /// checks for this failure mode. /// /// [`schema_resource_bundled()`]: Self::schema_resource_bundled - /// [`with_resource()`]: jsonschema::ValidationOptions::with_resource - /// [`with_resources()`]: jsonschema::ValidationOptions::with_resources + /// [`with_registry()`]: jsonschema::ValidationOptions::with_registry pub fn schema_resource_canonical(generator: &mut schemars::SchemaGenerator) -> Resource { Resource::from_contents(Self::json_schema_canonical(generator).to_value()) } @@ -287,8 +283,7 @@ pub static VSCODE_DIALECT_SCHEMA_CANONICAL: LazyLock> = LazyLock::ne }); /// Contains the bundled form of the VS Code meta schema as a [`Resource`] so you can include -/// it in the registered resources for a [`jsonschema::Validator`] using the [`with_resource()`] -/// or [`with_resources()`] methods on the [`jsonschema::ValidationOptions`] builder. +/// it in the registered resources for a [`jsonschema::Validator`] using the [`with_registry()`] method on [`jsonschema::ValidationOptions`]. /// /// The bundled form presents the meta schema as a compound schema document with the VS Code /// vocabulary and keyword schemas included under the `$defs` keyword. Use this form of the @@ -301,8 +296,7 @@ pub static VSCODE_DIALECT_SCHEMA_CANONICAL: LazyLock> = LazyLock::ne /// JSON Schema draft 2020-12. To retrieve the bundled schema with custom generator settings, /// use the [`json_schema_bundled()`] method. /// -/// [`with_resource()`]: jsonschema::ValidationOptions::with_resource -/// [`with_resources()`]: jsonschema::ValidationOptions::with_resources +/// [`with_registry()`]: jsonschema::ValidationOptions::with_registry /// [`json_schema_bundled()`]: VSCodeDialect::json_schema_bundled pub static VSCODE_DIALECT_SCHEMA_RESOURCE_BUNDLED: LazyLock> = LazyLock::new(|| { let generator = &mut SchemaGenerator::new( @@ -313,8 +307,7 @@ pub static VSCODE_DIALECT_SCHEMA_RESOURCE_BUNDLED: LazyLock> = Laz }); /// Contains the canonical form of the VS Code meta schema as a [`Resource`] so you can include -/// it in the registered resources for a [`jsonschema::Validator`] using the [`with_resource()`] -/// or [`with_resources()`] methods on the [`jsonschema::ValidationOptions`] builder. +/// it in the registered resources for a [`jsonschema::Validator`] using the [`with_registry()`] method on [`jsonschema::ValidationOptions`]. /// /// The canonical form presents the meta schema without bundling the VS Code vocabulary or /// keyword schemas under the `$defs` keyword. Use this form of the schema when you can rely @@ -327,8 +320,7 @@ pub static VSCODE_DIALECT_SCHEMA_RESOURCE_BUNDLED: LazyLock> = Laz /// JSON Schema draft 2020-12. To retrieve the bundled schema with custom generator settings, /// use the [`json_schema_canonical()`] method. /// -/// [`with_resource()`]: jsonschema::ValidationOptions::with_resource -/// [`with_resources()`]: jsonschema::ValidationOptions::with_resources +/// [`with_registry()`]: jsonschema::ValidationOptions::with_registry /// [`json_schema_canonical()`]: VSCodeDialect::json_schema_canonical pub static VSCODE_DIALECT_SCHEMA_RESOURCE_CANONICAL: LazyLock> = LazyLock::new(|| { let generator = &mut SchemaGenerator::new( diff --git a/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs b/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs index db273cb1d..4f3470894 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs @@ -131,8 +131,7 @@ impl VSCodeVocabulary { } /// Retrieves the bundled form of the vocabulary schema as a [`Resource`] so you can include - /// it in the registered resources for a [`jsonschema::Validator`] using the [`with_resource()`] - /// or [`with_resources()`] methods on the [`jsonschema::ValidationOptions`] builder. + /// it in the registered resources for a [`jsonschema::Validator`] using the [`with_registry()`] method on [`jsonschema::ValidationOptions`]. /// /// The bundled form presents the vocabulary schema as a compound schema document with the /// VS Code keyword schemas included under the `$defs` keyword. Use this form of the schema @@ -157,15 +156,13 @@ impl VSCodeVocabulary { /// checks for this failure mode. /// /// [`schema_resource_canonical()`]: Self::schema_resource_canonical - /// [`with_resource()`]: jsonschema::ValidationOptions::with_resource - /// [`with_resources()`]: jsonschema::ValidationOptions::with_resources + /// [`with_registry()`]: jsonschema::ValidationOptions::with_registry pub fn schema_resource_bundled(generator: &mut schemars::SchemaGenerator) -> Resource { Resource::from_contents(Self::json_schema(generator).to_value()) } /// Retrieves the bundled form of the vocabulary schema as a [`Resource`] so you can include - /// it in the registered resources for a [`jsonschema::Validator`] using the [`with_resource()`] - /// or [`with_resources()`] methods on the [`jsonschema::ValidationOptions`] builder. + /// it in the registered resources for a [`jsonschema::Validator`] using the [`with_registry()`] method on [`jsonschema::ValidationOptions`]. /// /// The canonical form presents the vocabulary schema without bundling the VS Code keyword /// schemas under the `$defs` keyword. Use this form of the schema when you can rely on @@ -190,8 +187,7 @@ impl VSCodeVocabulary { /// checks for this failure mode. /// /// [`schema_resource_bundled()`]: Self::schema_resource_bundled - /// [`with_resource()`]: jsonschema::ValidationOptions::with_resource - /// [`with_resources()`]: jsonschema::ValidationOptions::with_resources + /// [`with_registry()`]: jsonschema::ValidationOptions::with_registry pub fn schema_resource_canonical(generator: &mut schemars::SchemaGenerator) -> Resource { Resource::from_contents(Self::json_schema_canonical(generator).to_value()) } @@ -306,8 +302,7 @@ pub static VSCODE_VOCABULARY_SCHEMA_CANONICAL: LazyLock> = LazyLock: /// Contains the bundled form of the VS Code vocabulary schema as a [`Resource`] so you can /// include it in the registered resources for a [`jsonschema::Validator`] using the -/// [`with_resource()`] or [`with_resources()`] methods on the -/// [`jsonschema::ValidationOptions`] builder. +/// [`with_registry()`] method on [`jsonschema::ValidationOptions`]. /// /// The bundled form presents the vocabulary schema as a compound schema document with the /// VS Code keyword schemas included under the `$defs` keyword. Use this form of the schema @@ -320,8 +315,7 @@ pub static VSCODE_VOCABULARY_SCHEMA_CANONICAL: LazyLock> = LazyLock: /// JSON Schema draft 2020-12. To retrieve the bundled schema with custom generator settings, /// use the [`json_schema_bundled()`] method. /// -/// [`with_resource()`]: jsonschema::ValidationOptions::with_resource -/// [`with_resources()`]: jsonschema::ValidationOptions::with_resources +/// [`with_registry()`]: jsonschema::ValidationOptions::with_registry /// [`json_schema_bundled()`]: VSCodeVocabulary::json_schema_bundled pub static VSCODE_VOCABULARY_SCHEMA_RESOURCE_BUNDLED: LazyLock> = LazyLock::new(|| { let generator = &mut SchemaGenerator::new( @@ -333,8 +327,7 @@ pub static VSCODE_VOCABULARY_SCHEMA_RESOURCE_BUNDLED: LazyLock> = /// Contains the canonical form of the VS Code vocabulary schema as a [`Resource`] so you can /// include it in the registered resources for a [`jsonschema::Validator`] using the -/// [`with_resource()`] or [`with_resources()`] methods on the -/// [`jsonschema::ValidationOptions`] builder. +/// [`with_registry()`] method on [`jsonschema::ValidationOptions`]. /// /// The canonical form presents the meta schema without bundling the VS Code keyword schemas /// under the `$defs` keyword. Use this form of the schema when you can rely on retrieving the @@ -347,8 +340,7 @@ pub static VSCODE_VOCABULARY_SCHEMA_RESOURCE_BUNDLED: LazyLock> = /// JSON Schema draft 2020-12. To retrieve the bundled schema with custom generator settings, /// use the [`json_schema_canonical()`] method. /// -/// [`with_resource()`]: jsonschema::ValidationOptions::with_resource -/// [`with_resources()`]: jsonschema::ValidationOptions::with_resources +/// [`with_registry()`]: jsonschema::ValidationOptions::with_registry /// [`json_schema_canonical()`]: VSCodeVocabulary::json_schema_canonical pub static VSCODE_VOCABULARY_SCHEMA_RESOURCE_CANONICAL: LazyLock> = LazyLock::new(|| { let generator = &mut SchemaGenerator::new( From 3063f6ffe8186e7f5169def41e5bdeefedfb1f70 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Mon, 27 Jul 2026 14:19:23 -0700 Subject: [PATCH 5/7] Fix schema_resource_canonical() docstrings and simplify register() lifetime - Fix misleading 'bundled' wording in schema_resource_canonical() docs for both VSCodeDialect and VSCodeVocabulary - Replace explicit lifetime + clippy allow with anonymous lifetime ('_') on VSCodeKeyword::register() Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- lib/dsc-lib-jsonschema/src/vscode/dialect.rs | 2 +- lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs | 3 +-- lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/dsc-lib-jsonschema/src/vscode/dialect.rs b/lib/dsc-lib-jsonschema/src/vscode/dialect.rs index ab85c918f..1a829f522 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/dialect.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/dialect.rs @@ -147,7 +147,7 @@ impl VSCodeDialect { Resource::from_contents(Self::json_schema(generator).to_value()) } - /// Retrieves the bundled form of the meta schema as a [`Resource`] so you can include + /// Retrieves the canonical form of the meta schema as a [`Resource`] so you can include /// it in the registered resources for a [`jsonschema::Validator`] using the [`with_registry()`] method on [`jsonschema::ValidationOptions`]. /// /// The canonical form presents the meta schema without bundling the VS Code vocabulary or diff --git a/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs b/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs index dc62841b6..9064523cd 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/keywords/vscode_keyword.rs @@ -131,8 +131,7 @@ impl VSCodeKeyword { /// [`VSCodeValidationOptionsExtensions`]: crate::vscode::VSCodeValidationOptionsExtensions /// [`with_vscode_keyword()`]: crate::vscode::VSCodeValidationOptionsExtensions::with_vscode_keyword /// [`VSCODE_DIALECT_REGISTRY`]: crate::vscode::VSCODE_DIALECT_REGISTRY - #[allow(clippy::elidable_lifetime_names)] - pub fn register<'i>(self, options: ValidationOptions<'i>) -> ValidationOptions<'i> { + pub fn register(self, options: ValidationOptions<'_>) -> ValidationOptions<'_> { match self { Self::AllowComments => options.with_keyword( AllowCommentsKeyword::KEYWORD_NAME, diff --git a/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs b/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs index 4f3470894..497e67b5d 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs @@ -161,7 +161,7 @@ impl VSCodeVocabulary { Resource::from_contents(Self::json_schema(generator).to_value()) } - /// Retrieves the bundled form of the vocabulary schema as a [`Resource`] so you can include + /// Retrieves the canonical form of the vocabulary schema as a [`Resource`] so you can include /// it in the registered resources for a [`jsonschema::Validator`] using the [`with_registry()`] method on [`jsonschema::ValidationOptions`]. /// /// The canonical form presents the vocabulary schema without bundling the VS Code keyword From bae7ef680f542740a406b459d97e6b2ba5f4e7ff Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Mon, 27 Jul 2026 14:36:12 -0700 Subject: [PATCH 6/7] Clarify Resource/Registry docs and improve panic messages - Reword Resource docstrings to clarify that callers add the Resource to a Registry, then pass the Registry via with_registry() - Replace generic .expect("valid URI") with .unwrap_or_else() that includes the failing URI in the panic message Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- lib/dsc-lib-jsonschema/src/vscode/dialect.rs | 16 +++++----- .../vscode/validation_options_extensions.rs | 32 +++++++++---------- .../src/vscode/vocabulary.rs | 16 +++++----- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/lib/dsc-lib-jsonschema/src/vscode/dialect.rs b/lib/dsc-lib-jsonschema/src/vscode/dialect.rs index 1a829f522..97d33c575 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/dialect.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/dialect.rs @@ -117,8 +117,8 @@ impl VSCodeDialect { schema } - /// Retrieves the bundled form of the meta schema as a [`Resource`] so you can include - /// it in the registered resources for a [`jsonschema::Validator`] using the [`with_registry()`] method on [`jsonschema::ValidationOptions`]. + /// Retrieves the bundled form of the meta schema as a [`Resource`] so you can add + /// it to a [`referencing::Registry`] and pass that registry to [`with_registry()`] on [`jsonschema::ValidationOptions`]. /// /// The bundled form presents the meta schema as a compound schema document with the VS Code /// vocabulary and keyword schemas included under the `$defs` keyword. Use this form of the @@ -147,8 +147,8 @@ impl VSCodeDialect { Resource::from_contents(Self::json_schema(generator).to_value()) } - /// Retrieves the canonical form of the meta schema as a [`Resource`] so you can include - /// it in the registered resources for a [`jsonschema::Validator`] using the [`with_registry()`] method on [`jsonschema::ValidationOptions`]. + /// Retrieves the canonical form of the meta schema as a [`Resource`] so you can add + /// it to a [`referencing::Registry`] and pass that registry to [`with_registry()`] on [`jsonschema::ValidationOptions`]. /// /// The canonical form presents the meta schema without bundling the VS Code vocabulary or /// keyword schemas under the `$defs` keyword. Use this form of the schema when you can rely @@ -282,8 +282,8 @@ pub static VSCODE_DIALECT_SCHEMA_CANONICAL: LazyLock> = LazyLock::ne Arc::from(VSCodeDialect::json_schema_canonical(generator)) }); -/// Contains the bundled form of the VS Code meta schema as a [`Resource`] so you can include -/// it in the registered resources for a [`jsonschema::Validator`] using the [`with_registry()`] method on [`jsonschema::ValidationOptions`]. +/// Contains the bundled form of the VS Code meta schema as a [`Resource`] so you can add +/// it to a [`referencing::Registry`] and pass that registry to [`with_registry()`] on [`jsonschema::ValidationOptions`]. /// /// The bundled form presents the meta schema as a compound schema document with the VS Code /// vocabulary and keyword schemas included under the `$defs` keyword. Use this form of the @@ -306,8 +306,8 @@ pub static VSCODE_DIALECT_SCHEMA_RESOURCE_BUNDLED: LazyLock> = Laz Arc::from(VSCodeDialect::schema_resource_bundled(generator)) }); -/// Contains the canonical form of the VS Code meta schema as a [`Resource`] so you can include -/// it in the registered resources for a [`jsonschema::Validator`] using the [`with_registry()`] method on [`jsonschema::ValidationOptions`]. +/// Contains the canonical form of the VS Code meta schema as a [`Resource`] so you can add +/// it to a [`referencing::Registry`] and pass that registry to [`with_registry()`] on [`jsonschema::ValidationOptions`]. /// /// The canonical form presents the meta schema without bundling the VS Code vocabulary or /// keyword schemas under the `$defs` keyword. Use this form of the schema when you can rely diff --git a/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs b/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs index 21386bfcb..72c46f472 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs @@ -38,37 +38,37 @@ use crate::vscode::{ pub static VSCODE_DIALECT_REGISTRY: LazyLock> = LazyLock::new(|| { Registry::new() .add(AllowCommentsKeyword::KEYWORD_ID, AllowCommentsKeyword::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", AllowCommentsKeyword::KEYWORD_ID)) .add(AllowTrailingCommasKeyword::KEYWORD_ID, AllowTrailingCommasKeyword::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", AllowTrailingCommasKeyword::KEYWORD_ID)) .add(CompletionDetailKeyword::KEYWORD_ID, CompletionDetailKeyword::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", CompletionDetailKeyword::KEYWORD_ID)) .add(DefaultSnippetsKeyword::KEYWORD_ID, DefaultSnippetsKeyword::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", DefaultSnippetsKeyword::KEYWORD_ID)) .add(DeprecationMessageKeyword::KEYWORD_ID, DeprecationMessageKeyword::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", DeprecationMessageKeyword::KEYWORD_ID)) .add(DoNotSuggestKeyword::KEYWORD_ID, DoNotSuggestKeyword::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", DoNotSuggestKeyword::KEYWORD_ID)) .add(EnumDescriptionsKeyword::KEYWORD_ID, EnumDescriptionsKeyword::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", EnumDescriptionsKeyword::KEYWORD_ID)) .add(EnumDetailsKeyword::KEYWORD_ID, EnumDetailsKeyword::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", EnumDetailsKeyword::KEYWORD_ID)) .add(EnumSortTextsKeyword::KEYWORD_ID, EnumSortTextsKeyword::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", EnumSortTextsKeyword::KEYWORD_ID)) .add(ErrorMessageKeyword::KEYWORD_ID, ErrorMessageKeyword::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", ErrorMessageKeyword::KEYWORD_ID)) .add(MarkdownDescriptionKeyword::KEYWORD_ID, MarkdownDescriptionKeyword::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", MarkdownDescriptionKeyword::KEYWORD_ID)) .add(MarkdownEnumDescriptionsKeyword::KEYWORD_ID, MarkdownEnumDescriptionsKeyword::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", MarkdownEnumDescriptionsKeyword::KEYWORD_ID)) .add(PatternErrorMessageKeyword::KEYWORD_ID, PatternErrorMessageKeyword::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", PatternErrorMessageKeyword::KEYWORD_ID)) .add(SuggestSortTextKeyword::KEYWORD_ID, SuggestSortTextKeyword::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", SuggestSortTextKeyword::KEYWORD_ID)) .add(VSCodeVocabulary::SCHEMA_ID, VSCodeVocabulary::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", VSCodeVocabulary::SCHEMA_ID)) .add(VSCodeDialect::SCHEMA_ID, VSCodeDialect::default_schema_resource()) - .expect("valid URI") + .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", VSCodeDialect::SCHEMA_ID)) .prepare() .expect("valid registry") }); diff --git a/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs b/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs index 497e67b5d..7b5e51bb8 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/vocabulary.rs @@ -130,8 +130,8 @@ impl VSCodeVocabulary { schema } - /// Retrieves the bundled form of the vocabulary schema as a [`Resource`] so you can include - /// it in the registered resources for a [`jsonschema::Validator`] using the [`with_registry()`] method on [`jsonschema::ValidationOptions`]. + /// Retrieves the bundled form of the vocabulary schema as a [`Resource`] so you can add + /// it to a [`referencing::Registry`] and pass that registry to [`with_registry()`] on [`jsonschema::ValidationOptions`]. /// /// The bundled form presents the vocabulary schema as a compound schema document with the /// VS Code keyword schemas included under the `$defs` keyword. Use this form of the schema @@ -161,8 +161,8 @@ impl VSCodeVocabulary { Resource::from_contents(Self::json_schema(generator).to_value()) } - /// Retrieves the canonical form of the vocabulary schema as a [`Resource`] so you can include - /// it in the registered resources for a [`jsonschema::Validator`] using the [`with_registry()`] method on [`jsonschema::ValidationOptions`]. + /// Retrieves the canonical form of the vocabulary schema as a [`Resource`] so you can add + /// it to a [`referencing::Registry`] and pass that registry to [`with_registry()`] on [`jsonschema::ValidationOptions`]. /// /// The canonical form presents the vocabulary schema without bundling the VS Code keyword /// schemas under the `$defs` keyword. Use this form of the schema when you can rely on @@ -301,8 +301,8 @@ pub static VSCODE_VOCABULARY_SCHEMA_CANONICAL: LazyLock> = LazyLock: }); /// Contains the bundled form of the VS Code vocabulary schema as a [`Resource`] so you can -/// include it in the registered resources for a [`jsonschema::Validator`] using the -/// [`with_registry()`] method on [`jsonschema::ValidationOptions`]. +/// add it to a [`referencing::Registry`] and pass that registry to [`with_registry()`] on +/// [`jsonschema::ValidationOptions`]. /// /// The bundled form presents the vocabulary schema as a compound schema document with the /// VS Code keyword schemas included under the `$defs` keyword. Use this form of the schema @@ -326,8 +326,8 @@ pub static VSCODE_VOCABULARY_SCHEMA_RESOURCE_BUNDLED: LazyLock> = }); /// Contains the canonical form of the VS Code vocabulary schema as a [`Resource`] so you can -/// include it in the registered resources for a [`jsonschema::Validator`] using the -/// [`with_registry()`] method on [`jsonschema::ValidationOptions`]. +/// add it to a [`referencing::Registry`] and pass that registry to [`with_registry()`] on +/// [`jsonschema::ValidationOptions`]. /// /// The canonical form presents the meta schema without bundling the VS Code keyword schemas /// under the `$defs` keyword. Use this form of the schema when you can rely on retrieving the From b0067ba968899637f26c5080cad235c0089caf18 Mon Sep 17 00:00:00 2001 From: Steve Lee Date: Mon, 27 Jul 2026 14:50:30 -0700 Subject: [PATCH 7/7] Include error in registry prepare() panic message Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../src/vscode/validation_options_extensions.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs b/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs index 72c46f472..910a91944 100644 --- a/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs +++ b/lib/dsc-lib-jsonschema/src/vscode/validation_options_extensions.rs @@ -70,7 +70,7 @@ pub static VSCODE_DIALECT_REGISTRY: LazyLock> = LazyLock::new( .add(VSCodeDialect::SCHEMA_ID, VSCodeDialect::default_schema_resource()) .unwrap_or_else(|e| panic!("invalid URI for {}: {e}", VSCodeDialect::SCHEMA_ID)) .prepare() - .expect("valid registry") + .unwrap_or_else(|e| panic!("failed to prepare VSCODE_DIALECT_REGISTRY: {e}")) }); /// Defines extension methods to the [`jsonschema::ValidationOptions`] to simplify registering the