From 5a5a07c7fad31641d032a743e4e87ffb58ade17d Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Fri, 22 May 2026 22:10:19 +0800 Subject: Initial commit --- .cargo/config.toml | 7 + .gitignore | 1 + Cargo.lock | 71 + Cargo.toml | 21 + LICENSE | 21 + rola-cli/Cargo.toml | 8 + rola-cli/src/main.rs | 3 + rola-desktop/App.axaml | 15 + rola-desktop/App.axaml.cs | 47 + rola-desktop/Assets/avalonia-logo.ico | Bin 0 -> 175875 bytes rola-desktop/Program.cs | 21 + rola-desktop/ViewLocator.cs | 31 + rola-desktop/ViewModels/MainWindowViewModel.cs | 6 + rola-desktop/ViewModels/ViewModelBase.cs | 7 + rola-desktop/Views/MainWindow.axaml | 20 + rola-desktop/Views/MainWindow.axaml.cs | 11 + rola-desktop/app.manifest | 18 + rola-desktop/obj/project.assets.json | 1556 ++++++++++++++++++++ rola-desktop/obj/project.nuget.cache | 38 + .../obj/rola-desktop.csproj.nuget.dgspec.json | 95 ++ rola-desktop/obj/rola-desktop.csproj.nuget.g.props | 24 + .../obj/rola-desktop.csproj.nuget.g.targets | 10 + rola-desktop/rola-desktop.csproj | 28 + rola-utils/functions/Cargo.toml | 8 + rola-utils/functions/src/levenshtein_distance.rs | 117 ++ rola-utils/functions/src/lib.rs | 2 + rola-utils/macros/Cargo.toml | 14 + rola-utils/macros/src/lib.rs | 1 + rola-vcs/Cargo.toml | 9 + rola-vcs/internal_macros/Cargo.toml | 14 + rola-vcs/internal_macros/src/constants.rs | 115 ++ rola-vcs/internal_macros/src/lib.rs | 39 + rola-vcs/src/abstracts.rs | 2 + rola-vcs/src/abstracts/dir_pointer.rs | 88 ++ rola-vcs/src/bucket.rs | 18 + rola-vcs/src/err.rs | 105 ++ rola-vcs/src/err/io.rs | 10 + rola-vcs/src/lib.rs | 24 + rola-vcs/src/tools.rs | 1 + rola-vcs/src/tools/dir_search.rs | 54 + rola-vcs/src/workdraft.rs | 150 ++ 41 files changed, 2830 insertions(+) create mode 100644 .cargo/config.toml create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 rola-cli/Cargo.toml create mode 100644 rola-cli/src/main.rs create mode 100644 rola-desktop/App.axaml create mode 100644 rola-desktop/App.axaml.cs create mode 100644 rola-desktop/Assets/avalonia-logo.ico create mode 100644 rola-desktop/Program.cs create mode 100644 rola-desktop/ViewLocator.cs create mode 100644 rola-desktop/ViewModels/MainWindowViewModel.cs create mode 100644 rola-desktop/ViewModels/ViewModelBase.cs create mode 100644 rola-desktop/Views/MainWindow.axaml create mode 100644 rola-desktop/Views/MainWindow.axaml.cs create mode 100644 rola-desktop/app.manifest create mode 100644 rola-desktop/obj/project.assets.json create mode 100644 rola-desktop/obj/project.nuget.cache create mode 100644 rola-desktop/obj/rola-desktop.csproj.nuget.dgspec.json create mode 100644 rola-desktop/obj/rola-desktop.csproj.nuget.g.props create mode 100644 rola-desktop/obj/rola-desktop.csproj.nuget.g.targets create mode 100644 rola-desktop/rola-desktop.csproj create mode 100644 rola-utils/functions/Cargo.toml create mode 100644 rola-utils/functions/src/levenshtein_distance.rs create mode 100644 rola-utils/functions/src/lib.rs create mode 100644 rola-utils/macros/Cargo.toml create mode 100644 rola-utils/macros/src/lib.rs create mode 100644 rola-vcs/Cargo.toml create mode 100644 rola-vcs/internal_macros/Cargo.toml create mode 100644 rola-vcs/internal_macros/src/constants.rs create mode 100644 rola-vcs/internal_macros/src/lib.rs create mode 100644 rola-vcs/src/abstracts.rs create mode 100644 rola-vcs/src/abstracts/dir_pointer.rs create mode 100644 rola-vcs/src/bucket.rs create mode 100644 rola-vcs/src/err.rs create mode 100644 rola-vcs/src/err/io.rs create mode 100644 rola-vcs/src/lib.rs create mode 100644 rola-vcs/src/tools.rs create mode 100644 rola-vcs/src/tools/dir_search.rs create mode 100644 rola-vcs/src/workdraft.rs diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..11eebcf --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,7 @@ +[build] +target-dir = "./.temp/target" + +[env] + +[alias] +rola-doc = "doc --workspace --no-deps --open" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e0fdece --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.temp diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..ab047c4 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,71 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rola-cli" +version = "0.1.0" + +[[package]] +name = "rorolala" +version = "0.1.0" +dependencies = [ + "rorolala_internal_macros", +] + +[[package]] +name = "rorolala_internal_macros" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "shared_functions" +version = "0.1.0" + +[[package]] +name = "shared_macros" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..09644cc --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,21 @@ +[workspace] +resolver = "2" +members = [ + "rola-cli", + "rola-vcs", + "rola-vcs/internal_macros", + "rola-utils/functions", + "rola-utils/macros", +] + +[workspace.package] +version = "0.1.0" +edition = "2024" +authors = ["RoroLalaVCS", "Weicao-CatilGrass "] +license = "MIT" + +[workspace.dependencies] +rorolala = { path = "rola-vcs" } +rorolala_internal_macros = { path = "rola-vcs/internal_macros" } +shared_functions = { path = "rola-utils/functions" } +shared_macros = { path = "rola-utils/macros" } diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..96889a1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 RoroLala VCS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/rola-cli/Cargo.toml b/rola-cli/Cargo.toml new file mode 100644 index 0000000..433b351 --- /dev/null +++ b/rola-cli/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "rola-cli" +version.workspace = true +edition.workspace = true +authors.workspace = true +license.workspace = true + +[dependencies] diff --git a/rola-cli/src/main.rs b/rola-cli/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/rola-cli/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/rola-desktop/App.axaml b/rola-desktop/App.axaml new file mode 100644 index 0000000..bd879fe --- /dev/null +++ b/rola-desktop/App.axaml @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/rola-desktop/App.axaml.cs b/rola-desktop/App.axaml.cs new file mode 100644 index 0000000..6b665bc --- /dev/null +++ b/rola-desktop/App.axaml.cs @@ -0,0 +1,47 @@ +using Avalonia; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Data.Core; +using Avalonia.Data.Core.Plugins; +using System.Linq; +using Avalonia.Markup.Xaml; +using rola_desktop.ViewModels; +using rola_desktop.Views; + +namespace rola_desktop; + +public partial class App : Application +{ + public override void Initialize() + { + AvaloniaXamlLoader.Load(this); + } + + public override void OnFrameworkInitializationCompleted() + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + // Avoid duplicate validations from both Avalonia and the CommunityToolkit. + // More info: https://docs.avaloniaui.net/docs/guides/development-guides/data-validation#manage-validationplugins + DisableAvaloniaDataAnnotationValidation(); + desktop.MainWindow = new MainWindow + { + DataContext = new MainWindowViewModel(), + }; + } + + base.OnFrameworkInitializationCompleted(); + } + + private void DisableAvaloniaDataAnnotationValidation() + { + // Get an array of plugins to remove + var dataValidationPluginsToRemove = + BindingPlugins.DataValidators.OfType().ToArray(); + + // remove each entry found + foreach (var plugin in dataValidationPluginsToRemove) + { + BindingPlugins.DataValidators.Remove(plugin); + } + } +} \ No newline at end of file diff --git a/rola-desktop/Assets/avalonia-logo.ico b/rola-desktop/Assets/avalonia-logo.ico new file mode 100644 index 0000000..f7da8bb Binary files /dev/null and b/rola-desktop/Assets/avalonia-logo.ico differ diff --git a/rola-desktop/Program.cs b/rola-desktop/Program.cs new file mode 100644 index 0000000..30e9ca6 --- /dev/null +++ b/rola-desktop/Program.cs @@ -0,0 +1,21 @@ +using Avalonia; +using System; + +namespace rola_desktop; + +sealed class Program +{ + // Initialization code. Don't use any Avalonia, third-party APIs or any + // SynchronizationContext-reliant code before AppMain is called: things aren't initialized + // yet and stuff might break. + [STAThread] + public static void Main(string[] args) => BuildAvaloniaApp() + .StartWithClassicDesktopLifetime(args); + + // Avalonia configuration, don't remove; also used by visual designer. + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure() + .UsePlatformDetect() + .WithInterFont() + .LogToTrace(); +} diff --git a/rola-desktop/ViewLocator.cs b/rola-desktop/ViewLocator.cs new file mode 100644 index 0000000..eec4713 --- /dev/null +++ b/rola-desktop/ViewLocator.cs @@ -0,0 +1,31 @@ +using System; +using Avalonia.Controls; +using Avalonia.Controls.Templates; +using rola_desktop.ViewModels; + +namespace rola_desktop; + +public class ViewLocator : IDataTemplate +{ + + public Control? Build(object? param) + { + if (param is null) + return null; + + var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal); + var type = Type.GetType(name); + + if (type != null) + { + return (Control)Activator.CreateInstance(type)!; + } + + return new TextBlock { Text = "Not Found: " + name }; + } + + public bool Match(object? data) + { + return data is ViewModelBase; + } +} diff --git a/rola-desktop/ViewModels/MainWindowViewModel.cs b/rola-desktop/ViewModels/MainWindowViewModel.cs new file mode 100644 index 0000000..2db588d --- /dev/null +++ b/rola-desktop/ViewModels/MainWindowViewModel.cs @@ -0,0 +1,6 @@ +namespace rola_desktop.ViewModels; + +public partial class MainWindowViewModel : ViewModelBase +{ + public string Greeting { get; } = "Welcome to Avalonia!"; +} diff --git a/rola-desktop/ViewModels/ViewModelBase.cs b/rola-desktop/ViewModels/ViewModelBase.cs new file mode 100644 index 0000000..f0aa7f1 --- /dev/null +++ b/rola-desktop/ViewModels/ViewModelBase.cs @@ -0,0 +1,7 @@ +using CommunityToolkit.Mvvm.ComponentModel; + +namespace rola_desktop.ViewModels; + +public class ViewModelBase : ObservableObject +{ +} diff --git a/rola-desktop/Views/MainWindow.axaml b/rola-desktop/Views/MainWindow.axaml new file mode 100644 index 0000000..6ed88af --- /dev/null +++ b/rola-desktop/Views/MainWindow.axaml @@ -0,0 +1,20 @@ + + + + + + + + + + diff --git a/rola-desktop/Views/MainWindow.axaml.cs b/rola-desktop/Views/MainWindow.axaml.cs new file mode 100644 index 0000000..14f9599 --- /dev/null +++ b/rola-desktop/Views/MainWindow.axaml.cs @@ -0,0 +1,11 @@ +using Avalonia.Controls; + +namespace rola_desktop.Views; + +public partial class MainWindow : Window +{ + public MainWindow() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/rola-desktop/app.manifest b/rola-desktop/app.manifest new file mode 100644 index 0000000..6454463 --- /dev/null +++ b/rola-desktop/app.manifest @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + diff --git a/rola-desktop/obj/project.assets.json b/rola-desktop/obj/project.assets.json new file mode 100644 index 0000000..c853354 --- /dev/null +++ b/rola-desktop/obj/project.assets.json @@ -0,0 +1,1556 @@ +{ + "version": 3, + "targets": { + "net9.0": { + "Avalonia/11.3.2": { + "type": "package", + "dependencies": { + "Avalonia.BuildServices": "0.0.31", + "Avalonia.Remote.Protocol": "11.3.2", + "MicroCom.Runtime": "0.11.0" + }, + "compile": { + "ref/net8.0/Avalonia.Base.dll": { + "related": ".xml" + }, + "ref/net8.0/Avalonia.Controls.dll": { + "related": ".xml" + }, + "ref/net8.0/Avalonia.DesignerSupport.dll": { + "related": ".xml" + }, + "ref/net8.0/Avalonia.Dialogs.dll": { + "related": ".xml" + }, + "ref/net8.0/Avalonia.Markup.Xaml.dll": { + "related": ".xml" + }, + "ref/net8.0/Avalonia.Markup.dll": { + "related": ".Xaml.xml;.xml" + }, + "ref/net8.0/Avalonia.Metal.dll": { + "related": ".xml" + }, + "ref/net8.0/Avalonia.MicroCom.dll": { + "related": ".xml" + }, + "ref/net8.0/Avalonia.OpenGL.dll": { + "related": ".xml" + }, + "ref/net8.0/Avalonia.Vulkan.dll": { + "related": ".xml" + }, + "ref/net8.0/Avalonia.dll": { + "related": ".Base.xml;.Controls.xml;.DesignerSupport.xml;.Dialogs.xml;.Markup.Xaml.xml;.Markup.xml;.Metal.xml;.MicroCom.xml;.OpenGL.xml;.Vulkan.xml;.xml" + } + }, + "runtime": { + "lib/net8.0/Avalonia.Base.dll": { + "related": ".xml" + }, + "lib/net8.0/Avalonia.Controls.dll": { + "related": ".xml" + }, + "lib/net8.0/Avalonia.DesignerSupport.dll": { + "related": ".xml" + }, + "lib/net8.0/Avalonia.Dialogs.dll": { + "related": ".xml" + }, + "lib/net8.0/Avalonia.Markup.Xaml.dll": { + "related": ".xml" + }, + "lib/net8.0/Avalonia.Markup.dll": { + "related": ".Xaml.xml;.xml" + }, + "lib/net8.0/Avalonia.Metal.dll": { + "related": ".xml" + }, + "lib/net8.0/Avalonia.MicroCom.dll": { + "related": ".xml" + }, + "lib/net8.0/Avalonia.OpenGL.dll": { + "related": ".xml" + }, + "lib/net8.0/Avalonia.Vulkan.dll": { + "related": ".xml" + }, + "lib/net8.0/Avalonia.dll": { + "related": ".Base.xml;.Controls.xml;.DesignerSupport.xml;.Dialogs.xml;.Markup.Xaml.xml;.Markup.xml;.Metal.xml;.MicroCom.xml;.OpenGL.xml;.Vulkan.xml;.xml" + } + }, + "build": { + "buildTransitive/Avalonia.props": {}, + "buildTransitive/Avalonia.targets": {} + } + }, + "Avalonia.Angle.Windows.Natives/2.1.25547.20250602": { + "type": "package", + "runtimeTargets": { + "runtimes/win-arm64/native/av_libglesv2.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-x64/native/av_libglesv2.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x86/native/av_libglesv2.dll": { + "assetType": "native", + "rid": "win-x86" + } + } + }, + "Avalonia.BuildServices/0.0.31": { + "type": "package", + "build": { + "buildTransitive/Avalonia.BuildServices.targets": {} + } + }, + "Avalonia.Controls.ColorPicker/11.3.2": { + "type": "package", + "dependencies": { + "Avalonia": "11.3.2", + "Avalonia.Remote.Protocol": "11.3.2" + }, + "compile": { + "lib/net8.0/Avalonia.Controls.ColorPicker.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Avalonia.Controls.ColorPicker.dll": { + "related": ".xml" + } + } + }, + "Avalonia.Desktop/11.3.2": { + "type": "package", + "dependencies": { + "Avalonia": "11.3.2", + "Avalonia.Native": "11.3.2", + "Avalonia.Skia": "11.3.2", + "Avalonia.Win32": "11.3.2", + "Avalonia.X11": "11.3.2" + }, + "compile": { + "lib/net8.0/Avalonia.Desktop.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Avalonia.Desktop.dll": { + "related": ".xml" + } + } + }, + "Avalonia.Diagnostics/11.3.2": { + "type": "package", + "dependencies": { + "Avalonia": "11.3.2", + "Avalonia.Controls.ColorPicker": "11.3.2", + "Avalonia.Themes.Simple": "11.3.2" + }, + "compile": { + "lib/net8.0/Avalonia.Diagnostics.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Avalonia.Diagnostics.dll": { + "related": ".xml" + } + } + }, + "Avalonia.Fonts.Inter/11.3.2": { + "type": "package", + "dependencies": { + "Avalonia": "11.3.2" + }, + "compile": { + "lib/net8.0/Avalonia.Fonts.Inter.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Avalonia.Fonts.Inter.dll": { + "related": ".xml" + } + } + }, + "Avalonia.FreeDesktop/11.3.2": { + "type": "package", + "dependencies": { + "Avalonia": "11.3.2", + "Tmds.DBus.Protocol": "0.21.2" + }, + "compile": { + "lib/net8.0/Avalonia.FreeDesktop.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Avalonia.FreeDesktop.dll": { + "related": ".xml" + } + } + }, + "Avalonia.Native/11.3.2": { + "type": "package", + "dependencies": { + "Avalonia": "11.3.2" + }, + "compile": { + "lib/net8.0/Avalonia.Native.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Avalonia.Native.dll": { + "related": ".xml" + } + }, + "runtimeTargets": { + "runtimes/osx/native/libAvaloniaNative.dylib": { + "assetType": "native", + "rid": "osx" + } + } + }, + "Avalonia.Remote.Protocol/11.3.2": { + "type": "package", + "compile": { + "lib/net8.0/Avalonia.Remote.Protocol.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Avalonia.Remote.Protocol.dll": { + "related": ".xml" + } + } + }, + "Avalonia.Skia/11.3.2": { + "type": "package", + "dependencies": { + "Avalonia": "11.3.2", + "HarfBuzzSharp": "8.3.1.1", + "HarfBuzzSharp.NativeAssets.Linux": "8.3.1.1", + "HarfBuzzSharp.NativeAssets.WebAssembly": "8.3.1.1", + "SkiaSharp": "2.88.9", + "SkiaSharp.NativeAssets.Linux": "2.88.9", + "SkiaSharp.NativeAssets.WebAssembly": "2.88.9" + }, + "compile": { + "lib/net8.0/Avalonia.Skia.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Avalonia.Skia.dll": { + "related": ".xml" + } + } + }, + "Avalonia.Themes.Fluent/11.3.2": { + "type": "package", + "dependencies": { + "Avalonia": "11.3.2" + }, + "compile": { + "lib/net8.0/Avalonia.Themes.Fluent.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Avalonia.Themes.Fluent.dll": { + "related": ".xml" + } + } + }, + "Avalonia.Themes.Simple/11.3.2": { + "type": "package", + "dependencies": { + "Avalonia": "11.3.2" + }, + "compile": { + "lib/net8.0/Avalonia.Themes.Simple.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Avalonia.Themes.Simple.dll": { + "related": ".xml" + } + } + }, + "Avalonia.Win32/11.3.2": { + "type": "package", + "dependencies": { + "Avalonia": "11.3.2", + "Avalonia.Angle.Windows.Natives": "2.1.25547.20250602" + }, + "compile": { + "lib/net8.0/Avalonia.Win32.Automation.dll": { + "related": ".xml" + }, + "lib/net8.0/Avalonia.Win32.dll": { + "related": ".Automation.xml;.xml" + } + }, + "runtime": { + "lib/net8.0/Avalonia.Win32.Automation.dll": { + "related": ".xml" + }, + "lib/net8.0/Avalonia.Win32.dll": { + "related": ".Automation.xml;.xml" + } + } + }, + "Avalonia.X11/11.3.2": { + "type": "package", + "dependencies": { + "Avalonia": "11.3.2", + "Avalonia.FreeDesktop": "11.3.2", + "Avalonia.Skia": "11.3.2" + }, + "compile": { + "lib/net8.0/Avalonia.X11.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Avalonia.X11.dll": { + "related": ".xml" + } + } + }, + "CommunityToolkit.Mvvm/8.2.1": { + "type": "package", + "compile": { + "lib/net6.0/CommunityToolkit.Mvvm.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net6.0/CommunityToolkit.Mvvm.dll": { + "related": ".pdb;.xml" + } + }, + "build": { + "buildTransitive/netstandard2.1/CommunityToolkit.Mvvm.targets": {} + } + }, + "HarfBuzzSharp/8.3.1.1": { + "type": "package", + "dependencies": { + "HarfBuzzSharp.NativeAssets.Win32": "8.3.1.1", + "HarfBuzzSharp.NativeAssets.macOS": "8.3.1.1" + }, + "compile": { + "lib/net8.0/HarfBuzzSharp.dll": { + "related": ".pdb" + } + }, + "runtime": { + "lib/net8.0/HarfBuzzSharp.dll": { + "related": ".pdb" + } + } + }, + "HarfBuzzSharp.NativeAssets.Linux/8.3.1.1": { + "type": "package", + "compile": { + "lib/net8.0/_._": {} + }, + "runtime": { + "lib/net8.0/_._": {} + }, + "runtimeTargets": { + "runtimes/linux-arm/native/libHarfBuzzSharp.so": { + "assetType": "native", + "rid": "linux-arm" + }, + "runtimes/linux-arm64/native/libHarfBuzzSharp.so": { + "assetType": "native", + "rid": "linux-arm64" + }, + "runtimes/linux-loongarch64/native/libHarfBuzzSharp.so": { + "assetType": "native", + "rid": "linux-loongarch64" + }, + "runtimes/linux-musl-arm/native/libHarfBuzzSharp.so": { + "assetType": "native", + "rid": "linux-musl-arm" + }, + "runtimes/linux-musl-arm64/native/libHarfBuzzSharp.so": { + "assetType": "native", + "rid": "linux-musl-arm64" + }, + "runtimes/linux-musl-loongarch64/native/libHarfBuzzSharp.so": { + "assetType": "native", + "rid": "linux-musl-loongarch64" + }, + "runtimes/linux-musl-riscv64/native/libHarfBuzzSharp.so": { + "assetType": "native", + "rid": "linux-musl-riscv64" + }, + "runtimes/linux-musl-x64/native/libHarfBuzzSharp.so": { + "assetType": "native", + "rid": "linux-musl-x64" + }, + "runtimes/linux-riscv64/native/libHarfBuzzSharp.so": { + "assetType": "native", + "rid": "linux-riscv64" + }, + "runtimes/linux-x64/native/libHarfBuzzSharp.so": { + "assetType": "native", + "rid": "linux-x64" + }, + "runtimes/linux-x86/native/libHarfBuzzSharp.so": { + "assetType": "native", + "rid": "linux-x86" + } + } + }, + "HarfBuzzSharp.NativeAssets.macOS/8.3.1.1": { + "type": "package", + "compile": { + "lib/net8.0/_._": {} + }, + "runtime": { + "lib/net8.0/_._": {} + }, + "runtimeTargets": { + "runtimes/osx/native/libHarfBuzzSharp.dylib": { + "assetType": "native", + "rid": "osx" + } + } + }, + "HarfBuzzSharp.NativeAssets.WebAssembly/8.3.1.1": { + "type": "package", + "compile": { + "lib/net8.0/_._": {} + }, + "runtime": { + "lib/net8.0/_._": {} + }, + "build": { + "buildTransitive/netstandard1.0/HarfBuzzSharp.NativeAssets.WebAssembly.props": {}, + "buildTransitive/netstandard1.0/HarfBuzzSharp.NativeAssets.WebAssembly.targets": {} + } + }, + "HarfBuzzSharp.NativeAssets.Win32/8.3.1.1": { + "type": "package", + "compile": { + "lib/net8.0/_._": {} + }, + "runtime": { + "lib/net8.0/_._": {} + }, + "runtimeTargets": { + "runtimes/win-arm64/native/libHarfBuzzSharp.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-x64/native/libHarfBuzzSharp.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x86/native/libHarfBuzzSharp.dll": { + "assetType": "native", + "rid": "win-x86" + } + } + }, + "MicroCom.Runtime/0.11.0": { + "type": "package", + "compile": { + "lib/net5.0/MicroCom.Runtime.dll": {} + }, + "runtime": { + "lib/net5.0/MicroCom.Runtime.dll": {} + } + }, + "SkiaSharp/2.88.9": { + "type": "package", + "dependencies": { + "SkiaSharp.NativeAssets.Win32": "2.88.9", + "SkiaSharp.NativeAssets.macOS": "2.88.9" + }, + "compile": { + "lib/net6.0/SkiaSharp.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net6.0/SkiaSharp.dll": { + "related": ".pdb;.xml" + } + } + }, + "SkiaSharp.NativeAssets.Linux/2.88.9": { + "type": "package", + "dependencies": { + "SkiaSharp": "2.88.9" + }, + "compile": { + "lib/net6.0/_._": {} + }, + "runtime": { + "lib/net6.0/_._": {} + }, + "runtimeTargets": { + "runtimes/linux-arm/native/libSkiaSharp.so": { + "assetType": "native", + "rid": "linux-arm" + }, + "runtimes/linux-arm64/native/libSkiaSharp.so": { + "assetType": "native", + "rid": "linux-arm64" + }, + "runtimes/linux-musl-x64/native/libSkiaSharp.so": { + "assetType": "native", + "rid": "linux-musl-x64" + }, + "runtimes/linux-x64/native/libSkiaSharp.so": { + "assetType": "native", + "rid": "linux-x64" + } + } + }, + "SkiaSharp.NativeAssets.macOS/2.88.9": { + "type": "package", + "compile": { + "lib/net6.0/_._": {} + }, + "runtime": { + "lib/net6.0/_._": {} + }, + "runtimeTargets": { + "runtimes/osx/native/libSkiaSharp.dylib": { + "assetType": "native", + "rid": "osx" + } + } + }, + "SkiaSharp.NativeAssets.WebAssembly/2.88.9": { + "type": "package", + "compile": { + "lib/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.0/_._": {} + }, + "build": { + "buildTransitive/netstandard1.0/SkiaSharp.NativeAssets.WebAssembly.props": {}, + "buildTransitive/netstandard1.0/SkiaSharp.NativeAssets.WebAssembly.targets": {} + } + }, + "SkiaSharp.NativeAssets.Win32/2.88.9": { + "type": "package", + "compile": { + "lib/net6.0/_._": {} + }, + "runtime": { + "lib/net6.0/_._": {} + }, + "runtimeTargets": { + "runtimes/win-arm64/native/libSkiaSharp.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-x64/native/libSkiaSharp.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x86/native/libSkiaSharp.dll": { + "assetType": "native", + "rid": "win-x86" + } + } + }, + "System.IO.Pipelines/8.0.0": { + "type": "package", + "compile": { + "lib/net8.0/System.IO.Pipelines.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.IO.Pipelines.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "Tmds.DBus.Protocol/0.21.2": { + "type": "package", + "dependencies": { + "System.IO.Pipelines": "8.0.0" + }, + "compile": { + "lib/net8.0/Tmds.DBus.Protocol.dll": {} + }, + "runtime": { + "lib/net8.0/Tmds.DBus.Protocol.dll": {} + } + } + } + }, + "libraries": { + "Avalonia/11.3.2": { + "sha512": "3w1v4/wEpHFq6WWVNyyrne2Jyz5bdQvnK3AW36rCto42L+AtdbnO/SG2SIqJ7ObXJl+Y3LXz2XDGx9Blzqduow==", + "type": "package", + "path": "avalonia/11.3.2", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "analyzers/dotnet/cs/Avalonia.Analyzers.dll", + "analyzers/dotnet/cs/Avalonia.Generators.dll", + "avalonia.11.3.2.nupkg.sha512", + "avalonia.nuspec", + "build/Avalonia.Generators.props", + "build/Avalonia.props", + "build/Avalonia.targets", + "build/AvaloniaBuildTasks.props", + "build/AvaloniaBuildTasks.targets", + "build/AvaloniaItemSchema.xaml", + "build/AvaloniaPrivateApis.targets", + "build/AvaloniaRules.Project.xml", + "build/AvaloniaSingleProject.targets", + "build/AvaloniaVersion.props", + "buildTransitive/Avalonia.Generators.props", + "buildTransitive/Avalonia.props", + "buildTransitive/Avalonia.targets", + "buildTransitive/AvaloniaBuildTasks.props", + "buildTransitive/AvaloniaBuildTasks.targets", + "buildTransitive/AvaloniaItemSchema.xaml", + "buildTransitive/AvaloniaPrivateApis.targets", + "buildTransitive/AvaloniaRules.Project.xml", + "buildTransitive/AvaloniaSingleProject.targets", + "lib/net6.0/Avalonia.Base.dll", + "lib/net6.0/Avalonia.Base.xml", + "lib/net6.0/Avalonia.Controls.dll", + "lib/net6.0/Avalonia.Controls.xml", + "lib/net6.0/Avalonia.DesignerSupport.dll", + "lib/net6.0/Avalonia.DesignerSupport.xml", + "lib/net6.0/Avalonia.Dialogs.dll", + "lib/net6.0/Avalonia.Dialogs.xml", + "lib/net6.0/Avalonia.Markup.Xaml.dll", + "lib/net6.0/Avalonia.Markup.Xaml.xml", + "lib/net6.0/Avalonia.Markup.dll", + "lib/net6.0/Avalonia.Markup.xml", + "lib/net6.0/Avalonia.Metal.dll", + "lib/net6.0/Avalonia.Metal.xml", + "lib/net6.0/Avalonia.MicroCom.dll", + "lib/net6.0/Avalonia.MicroCom.xml", + "lib/net6.0/Avalonia.OpenGL.dll", + "lib/net6.0/Avalonia.OpenGL.xml", + "lib/net6.0/Avalonia.Vulkan.dll", + "lib/net6.0/Avalonia.Vulkan.xml", + "lib/net6.0/Avalonia.dll", + "lib/net6.0/Avalonia.xml", + "lib/net8.0/Avalonia.Base.dll", + "lib/net8.0/Avalonia.Base.xml", + "lib/net8.0/Avalonia.Controls.dll", + "lib/net8.0/Avalonia.Controls.xml", + "lib/net8.0/Avalonia.DesignerSupport.dll", + "lib/net8.0/Avalonia.DesignerSupport.xml", + "lib/net8.0/Avalonia.Dialogs.dll", + "lib/net8.0/Avalonia.Dialogs.xml", + "lib/net8.0/Avalonia.Markup.Xaml.dll", + "lib/net8.0/Avalonia.Markup.Xaml.xml", + "lib/net8.0/Avalonia.Markup.dll", + "lib/net8.0/Avalonia.Markup.xml", + "lib/net8.0/Avalonia.Metal.dll", + "lib/net8.0/Avalonia.Metal.xml", + "lib/net8.0/Avalonia.MicroCom.dll", + "lib/net8.0/Avalonia.MicroCom.xml", + "lib/net8.0/Avalonia.OpenGL.dll", + "lib/net8.0/Avalonia.OpenGL.xml", + "lib/net8.0/Avalonia.Vulkan.dll", + "lib/net8.0/Avalonia.Vulkan.xml", + "lib/net8.0/Avalonia.dll", + "lib/net8.0/Avalonia.xml", + "lib/netstandard2.0/Avalonia.Base.dll", + "lib/netstandard2.0/Avalonia.Base.xml", + "lib/netstandard2.0/Avalonia.Controls.dll", + "lib/netstandard2.0/Avalonia.Controls.xml", + "lib/netstandard2.0/Avalonia.DesignerSupport.dll", + "lib/netstandard2.0/Avalonia.DesignerSupport.xml", + "lib/netstandard2.0/Avalonia.Dialogs.dll", + "lib/netstandard2.0/Avalonia.Dialogs.xml", + "lib/netstandard2.0/Avalonia.Markup.Xaml.dll", + "lib/netstandard2.0/Avalonia.Markup.Xaml.xml", + "lib/netstandard2.0/Avalonia.Markup.dll", + "lib/netstandard2.0/Avalonia.Markup.xml", + "lib/netstandard2.0/Avalonia.Metal.dll", + "lib/netstandard2.0/Avalonia.Metal.xml", + "lib/netstandard2.0/Avalonia.MicroCom.dll", + "lib/netstandard2.0/Avalonia.MicroCom.xml", + "lib/netstandard2.0/Avalonia.OpenGL.dll", + "lib/netstandard2.0/Avalonia.OpenGL.xml", + "lib/netstandard2.0/Avalonia.Vulkan.dll", + "lib/netstandard2.0/Avalonia.Vulkan.xml", + "lib/netstandard2.0/Avalonia.dll", + "lib/netstandard2.0/Avalonia.xml", + "ref/net6.0/Avalonia.Base.dll", + "ref/net6.0/Avalonia.Base.xml", + "ref/net6.0/Avalonia.Controls.dll", + "ref/net6.0/Avalonia.Controls.xml", + "ref/net6.0/Avalonia.DesignerSupport.dll", + "ref/net6.0/Avalonia.DesignerSupport.xml", + "ref/net6.0/Avalonia.Dialogs.dll", + "ref/net6.0/Avalonia.Dialogs.xml", + "ref/net6.0/Avalonia.Markup.Xaml.dll", + "ref/net6.0/Avalonia.Markup.Xaml.xml", + "ref/net6.0/Avalonia.Markup.dll", + "ref/net6.0/Avalonia.Markup.xml", + "ref/net6.0/Avalonia.Metal.dll", + "ref/net6.0/Avalonia.Metal.xml", + "ref/net6.0/Avalonia.MicroCom.dll", + "ref/net6.0/Avalonia.MicroCom.xml", + "ref/net6.0/Avalonia.OpenGL.dll", + "ref/net6.0/Avalonia.OpenGL.xml", + "ref/net6.0/Avalonia.Vulkan.dll", + "ref/net6.0/Avalonia.Vulkan.xml", + "ref/net6.0/Avalonia.dll", + "ref/net6.0/Avalonia.xml", + "ref/net8.0/Avalonia.Base.dll", + "ref/net8.0/Avalonia.Base.xml", + "ref/net8.0/Avalonia.Controls.dll", + "ref/net8.0/Avalonia.Controls.xml", + "ref/net8.0/Avalonia.DesignerSupport.dll", + "ref/net8.0/Avalonia.DesignerSupport.xml", + "ref/net8.0/Avalonia.Dialogs.dll", + "ref/net8.0/Avalonia.Dialogs.xml", + "ref/net8.0/Avalonia.Markup.Xaml.dll", + "ref/net8.0/Avalonia.Markup.Xaml.xml", + "ref/net8.0/Avalonia.Markup.dll", + "ref/net8.0/Avalonia.Markup.xml", + "ref/net8.0/Avalonia.Metal.dll", + "ref/net8.0/Avalonia.Metal.xml", + "ref/net8.0/Avalonia.MicroCom.dll", + "ref/net8.0/Avalonia.MicroCom.xml", + "ref/net8.0/Avalonia.OpenGL.dll", + "ref/net8.0/Avalonia.OpenGL.xml", + "ref/net8.0/Avalonia.Vulkan.dll", + "ref/net8.0/Avalonia.Vulkan.xml", + "ref/net8.0/Avalonia.dll", + "ref/net8.0/Avalonia.xml", + "ref/netstandard2.0/Avalonia.Base.dll", + "ref/netstandard2.0/Avalonia.Base.xml", + "ref/netstandard2.0/Avalonia.Controls.dll", + "ref/netstandard2.0/Avalonia.Controls.xml", + "ref/netstandard2.0/Avalonia.DesignerSupport.dll", + "ref/netstandard2.0/Avalonia.DesignerSupport.xml", + "ref/netstandard2.0/Avalonia.Dialogs.dll", + "ref/netstandard2.0/Avalonia.Dialogs.xml", + "ref/netstandard2.0/Avalonia.Markup.Xaml.dll", + "ref/netstandard2.0/Avalonia.Markup.Xaml.xml", + "ref/netstandard2.0/Avalonia.Markup.dll", + "ref/netstandard2.0/Avalonia.Markup.xml", + "ref/netstandard2.0/Avalonia.Metal.dll", + "ref/netstandard2.0/Avalonia.Metal.xml", + "ref/netstandard2.0/Avalonia.MicroCom.dll", + "ref/netstandard2.0/Avalonia.MicroCom.xml", + "ref/netstandard2.0/Avalonia.OpenGL.dll", + "ref/netstandard2.0/Avalonia.OpenGL.xml", + "ref/netstandard2.0/Avalonia.Vulkan.dll", + "ref/netstandard2.0/Avalonia.Vulkan.xml", + "ref/netstandard2.0/Avalonia.dll", + "ref/netstandard2.0/Avalonia.xml", + "tools/net461/designer/Avalonia.Designer.HostApp.exe", + "tools/netstandard2.0/Avalonia.Build.Tasks.dll", + "tools/netstandard2.0/designer/Avalonia.Designer.HostApp.dll" + ] + }, + "Avalonia.Angle.Windows.Natives/2.1.25547.20250602": { + "sha512": "ZL0VLc4s9rvNNFt19Pxm5UNAkmKNylugAwJPX9ulXZ6JWs/l6XZihPWWTyezaoNOVyEPU8YbURtW7XMAtqXH5A==", + "type": "package", + "path": "avalonia.angle.windows.natives/2.1.25547.20250602", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE", + "avalonia.angle.windows.natives.2.1.25547.20250602.nupkg.sha512", + "avalonia.angle.windows.natives.nuspec", + "runtimes/win-arm64/native/av_libglesv2.dll", + "runtimes/win-x64/native/av_libglesv2.dll", + "runtimes/win-x86/native/av_libglesv2.dll" + ] + }, + "Avalonia.BuildServices/0.0.31": { + "sha512": "KmCN6Hc+45q4OnF10ge450yVUvWuxU6bdQiyKqiSvrHKpahNrEdk0kG6Ip6GHk2SKOCttGQuA206JVdkldEENg==", + "type": "package", + "path": "avalonia.buildservices/0.0.31", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "avalonia.buildservices.0.0.31.nupkg.sha512", + "avalonia.buildservices.nuspec", + "build/Avalonia.BuildServices.targets", + "buildTransitive/Avalonia.BuildServices.targets", + "tools/netstandard2.0/Avalonia.BuildServices.Collector.dll", + "tools/netstandard2.0/Avalonia.BuildServices.dll", + "tools/netstandard2.0/runtimeconfig.json" + ] + }, + "Avalonia.Controls.ColorPicker/11.3.2": { + "sha512": "K72rpZb6nSDuKZtcj1cfIAqpTkduff3Ng3+O22MxKhmmRDcFO0GAz7kwEArbtJTC4SNlSezaCyx6XMdNvaMcPA==", + "type": "package", + "path": "avalonia.controls.colorpicker/11.3.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "avalonia.controls.colorpicker.11.3.2.nupkg.sha512", + "avalonia.controls.colorpicker.nuspec", + "lib/net6.0/Avalonia.Controls.ColorPicker.dll", + "lib/net6.0/Avalonia.Controls.ColorPicker.xml", + "lib/net8.0/Avalonia.Controls.ColorPicker.dll", + "lib/net8.0/Avalonia.Controls.ColorPicker.xml", + "lib/netstandard2.0/Avalonia.Controls.ColorPicker.dll", + "lib/netstandard2.0/Avalonia.Controls.ColorPicker.xml" + ] + }, + "Avalonia.Desktop/11.3.2": { + "sha512": "b2ZPZ60UN0Uib3ZxFrf+ixYiJTBFaXrpQAcXTSUKTDw0nAU29sbfjvdtpBkBd6+idWpNtI+GhOjf0Mw0v1ncQg==", + "type": "package", + "path": "avalonia.desktop/11.3.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "avalonia.desktop.11.3.2.nupkg.sha512", + "avalonia.desktop.nuspec", + "lib/net6.0/Avalonia.Desktop.dll", + "lib/net6.0/Avalonia.Desktop.xml", + "lib/net8.0/Avalonia.Desktop.dll", + "lib/net8.0/Avalonia.Desktop.xml", + "lib/netstandard2.0/Avalonia.Desktop.dll", + "lib/netstandard2.0/Avalonia.Desktop.xml" + ] + }, + "Avalonia.Diagnostics/11.3.2": { + "sha512": "3f4+uGJTrBCY9mxMy7690s8WKqyF4I29VFEUSASV5nVX6kyv/d1+OHBNd0GMyuyPOf+eEEA1ylNSHhRCw3jsvw==", + "type": "package", + "path": "avalonia.diagnostics/11.3.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "avalonia.diagnostics.11.3.2.nupkg.sha512", + "avalonia.diagnostics.nuspec", + "lib/net6.0/Avalonia.Diagnostics.dll", + "lib/net6.0/Avalonia.Diagnostics.xml", + "lib/net8.0/Avalonia.Diagnostics.dll", + "lib/net8.0/Avalonia.Diagnostics.xml", + "lib/netstandard2.0/Avalonia.Diagnostics.dll", + "lib/netstandard2.0/Avalonia.Diagnostics.xml" + ] + }, + "Avalonia.Fonts.Inter/11.3.2": { + "sha512": "gOijv2Tu8w6XurxYWSC4OdFycYbDooZfTcETXEx45syl710wpG+0aEHNFGlQyyOqqxGQHFbqxxwX6GxumD8b/g==", + "type": "package", + "path": "avalonia.fonts.inter/11.3.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "avalonia.fonts.inter.11.3.2.nupkg.sha512", + "avalonia.fonts.inter.nuspec", + "lib/net6.0/Avalonia.Fonts.Inter.dll", + "lib/net6.0/Avalonia.Fonts.Inter.xml", + "lib/net8.0/Avalonia.Fonts.Inter.dll", + "lib/net8.0/Avalonia.Fonts.Inter.xml", + "lib/netstandard2.0/Avalonia.Fonts.Inter.dll", + "lib/netstandard2.0/Avalonia.Fonts.Inter.xml" + ] + }, + "Avalonia.FreeDesktop/11.3.2": { + "sha512": "8laGOvPM83kB4xUqXGIRxN61Q5Ux/97URL7CU2Dizh4Nm7Ydj9+urKLTylk6dxWG7kZlo4e4k9G2aVUPkxTBGA==", + "type": "package", + "path": "avalonia.freedesktop/11.3.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "avalonia.freedesktop.11.3.2.nupkg.sha512", + "avalonia.freedesktop.nuspec", + "lib/net6.0/Avalonia.FreeDesktop.dll", + "lib/net6.0/Avalonia.FreeDesktop.xml", + "lib/net8.0/Avalonia.FreeDesktop.dll", + "lib/net8.0/Avalonia.FreeDesktop.xml", + "lib/netstandard2.0/Avalonia.FreeDesktop.dll", + "lib/netstandard2.0/Avalonia.FreeDesktop.xml" + ] + }, + "Avalonia.Native/11.3.2": { + "sha512": "dv3PVUcClxeDlNSoBjTdNuRYXdbzT3BgtpjEX/fv3pVreKfbh39wWQ+n4ecGh0FUKIlcj0X8BEaQ83t5eRsLnA==", + "type": "package", + "path": "avalonia.native/11.3.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "avalonia.native.11.3.2.nupkg.sha512", + "avalonia.native.nuspec", + "lib/net6.0/Avalonia.Native.dll", + "lib/net6.0/Avalonia.Native.xml", + "lib/net8.0/Avalonia.Native.dll", + "lib/net8.0/Avalonia.Native.xml", + "lib/netstandard2.0/Avalonia.Native.dll", + "lib/netstandard2.0/Avalonia.Native.xml", + "runtimes/osx/native/libAvaloniaNative.dylib" + ] + }, + "Avalonia.Remote.Protocol/11.3.2": { + "sha512": "my6aXePR+N7tl3xDKdYNH2ZFZWUSNmyeU37HIgYJX2fQ4IOBv7SeaWBEd1F/qVsIbOlYxaqE7qOPfeFFtdYq/A==", + "type": "package", + "path": "avalonia.remote.protocol/11.3.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "avalonia.remote.protocol.11.3.2.nupkg.sha512", + "avalonia.remote.protocol.nuspec", + "lib/net6.0/Avalonia.Remote.Protocol.dll", + "lib/net6.0/Avalonia.Remote.Protocol.xml", + "lib/net8.0/Avalonia.Remote.Protocol.dll", + "lib/net8.0/Avalonia.Remote.Protocol.xml", + "lib/netstandard2.0/Avalonia.Remote.Protocol.dll", + "lib/netstandard2.0/Avalonia.Remote.Protocol.xml" + ] + }, + "Avalonia.Skia/11.3.2": { + "sha512": "PJIPSqkWbQpKyWPMEIDAWYQaJ8xpJASg2H75sGWCkthLj+mCG/DZxdHI6UsDAcxKu/ppSRkX88RGo117bRYfFg==", + "type": "package", + "path": "avalonia.skia/11.3.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "avalonia.skia.11.3.2.nupkg.sha512", + "avalonia.skia.nuspec", + "lib/net6.0/Avalonia.Skia.dll", + "lib/net6.0/Avalonia.Skia.xml", + "lib/net8.0/Avalonia.Skia.dll", + "lib/net8.0/Avalonia.Skia.xml", + "lib/netstandard2.0/Avalonia.Skia.dll", + "lib/netstandard2.0/Avalonia.Skia.xml" + ] + }, + "Avalonia.Themes.Fluent/11.3.2": { + "sha512": "aRCCmFSumpHJOxsXbdUUc/AaJ/O1HLggfvSxtXYm84QCutuP4OCqgxP9Pka1hb1+2e/TQxfNqM/6KRKPt4SaRg==", + "type": "package", + "path": "avalonia.themes.fluent/11.3.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "avalonia.themes.fluent.11.3.2.nupkg.sha512", + "avalonia.themes.fluent.nuspec", + "lib/net6.0/Avalonia.Themes.Fluent.dll", + "lib/net6.0/Avalonia.Themes.Fluent.xml", + "lib/net8.0/Avalonia.Themes.Fluent.dll", + "lib/net8.0/Avalonia.Themes.Fluent.xml", + "lib/netstandard2.0/Avalonia.Themes.Fluent.dll", + "lib/netstandard2.0/Avalonia.Themes.Fluent.xml" + ] + }, + "Avalonia.Themes.Simple/11.3.2": { + "sha512": "0TnR6vVS5qStClhG0T9i5Q7jSlZxqrpBxzBb7HPzNqe8dkNfM6VTN38J82sggvZAVddqSc3XRrB+VgheChxKQw==", + "type": "package", + "path": "avalonia.themes.simple/11.3.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "avalonia.themes.simple.11.3.2.nupkg.sha512", + "avalonia.themes.simple.nuspec", + "lib/net6.0/Avalonia.Themes.Simple.dll", + "lib/net6.0/Avalonia.Themes.Simple.xml", + "lib/net8.0/Avalonia.Themes.Simple.dll", + "lib/net8.0/Avalonia.Themes.Simple.xml", + "lib/netstandard2.0/Avalonia.Themes.Simple.dll", + "lib/netstandard2.0/Avalonia.Themes.Simple.xml" + ] + }, + "Avalonia.Win32/11.3.2": { + "sha512": "CpM6zBwDwMFKw9/iyj0d8jxXKLZena/HFblS9Oc7BmLH8qxe8icr7ZBI5rElebrxDA5O590dAtfWdtOvB1/AZQ==", + "type": "package", + "path": "avalonia.win32/11.3.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "avalonia.win32.11.3.2.nupkg.sha512", + "avalonia.win32.nuspec", + "lib/net6.0/Avalonia.Win32.Automation.dll", + "lib/net6.0/Avalonia.Win32.Automation.xml", + "lib/net6.0/Avalonia.Win32.dll", + "lib/net6.0/Avalonia.Win32.xml", + "lib/net8.0/Avalonia.Win32.Automation.dll", + "lib/net8.0/Avalonia.Win32.Automation.xml", + "lib/net8.0/Avalonia.Win32.dll", + "lib/net8.0/Avalonia.Win32.xml", + "lib/netstandard2.0/Avalonia.Win32.Automation.dll", + "lib/netstandard2.0/Avalonia.Win32.Automation.xml", + "lib/netstandard2.0/Avalonia.Win32.dll", + "lib/netstandard2.0/Avalonia.Win32.xml" + ] + }, + "Avalonia.X11/11.3.2": { + "sha512": "MEMXOIaAr6jMtl9BhJ8sj7Vz+z19dWfcryWksV35LsolQhQmjmzJPVcCppdnvm5HxkohUXB1qN1RqWN1cqRwBQ==", + "type": "package", + "path": "avalonia.x11/11.3.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "avalonia.x11.11.3.2.nupkg.sha512", + "avalonia.x11.nuspec", + "lib/net6.0/Avalonia.X11.dll", + "lib/net6.0/Avalonia.X11.xml", + "lib/net8.0/Avalonia.X11.dll", + "lib/net8.0/Avalonia.X11.xml", + "lib/netstandard2.0/Avalonia.X11.dll", + "lib/netstandard2.0/Avalonia.X11.xml" + ] + }, + "CommunityToolkit.Mvvm/8.2.1": { + "sha512": "I24ofWVEdplxYjUez9/bljv/qb8r8Ccj6cvYXHexNBegLaD3iDy3QrzAAOYVMmfGWIXxlU1ZtECQNfU07+6hXQ==", + "type": "package", + "path": "communitytoolkit.mvvm/8.2.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "License.md", + "ThirdPartyNotices.txt", + "analyzers/dotnet/roslyn4.0/cs/CommunityToolkit.Mvvm.CodeFixers.dll", + "analyzers/dotnet/roslyn4.0/cs/CommunityToolkit.Mvvm.SourceGenerators.dll", + "analyzers/dotnet/roslyn4.3/cs/CommunityToolkit.Mvvm.CodeFixers.dll", + "analyzers/dotnet/roslyn4.3/cs/CommunityToolkit.Mvvm.SourceGenerators.dll", + "build/netstandard2.0/CommunityToolkit.Mvvm.targets", + "build/netstandard2.1/CommunityToolkit.Mvvm.targets", + "buildTransitive/netstandard2.0/CommunityToolkit.Mvvm.targets", + "buildTransitive/netstandard2.1/CommunityToolkit.Mvvm.targets", + "communitytoolkit.mvvm.8.2.1.nupkg.sha512", + "communitytoolkit.mvvm.nuspec", + "lib/net6.0/CommunityToolkit.Mvvm.dll", + "lib/net6.0/CommunityToolkit.Mvvm.pdb", + "lib/net6.0/CommunityToolkit.Mvvm.xml", + "lib/netstandard2.0/CommunityToolkit.Mvvm.dll", + "lib/netstandard2.0/CommunityToolkit.Mvvm.pdb", + "lib/netstandard2.0/CommunityToolkit.Mvvm.xml", + "lib/netstandard2.1/CommunityToolkit.Mvvm.dll", + "lib/netstandard2.1/CommunityToolkit.Mvvm.pdb", + "lib/netstandard2.1/CommunityToolkit.Mvvm.xml" + ] + }, + "HarfBuzzSharp/8.3.1.1": { + "sha512": "tLZN66oe/uiRPTZfrCU4i8ScVGwqHNh5MHrXj0yVf4l7Mz0FhTGnQ71RGySROTmdognAs0JtluHkL41pIabWuQ==", + "type": "package", + "path": "harfbuzzsharp/8.3.1.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt", + "README.md", + "harfbuzzsharp.8.3.1.1.nupkg.sha512", + "harfbuzzsharp.nuspec", + "icon.png", + "lib/net462/HarfBuzzSharp.dll", + "lib/net462/HarfBuzzSharp.pdb", + "lib/net6.0/HarfBuzzSharp.dll", + "lib/net6.0/HarfBuzzSharp.pdb", + "lib/net8.0-android34.0/HarfBuzzSharp.dll", + "lib/net8.0-android34.0/HarfBuzzSharp.pdb", + "lib/net8.0-android34.0/HarfBuzzSharp.xml", + "lib/net8.0-ios17.0/HarfBuzzSharp.dll", + "lib/net8.0-ios17.0/HarfBuzzSharp.pdb", + "lib/net8.0-maccatalyst17.0/HarfBuzzSharp.dll", + "lib/net8.0-maccatalyst17.0/HarfBuzzSharp.pdb", + "lib/net8.0-macos14.0/HarfBuzzSharp.dll", + "lib/net8.0-macos14.0/HarfBuzzSharp.pdb", + "lib/net8.0-tizen7.0/HarfBuzzSharp.dll", + "lib/net8.0-tizen7.0/HarfBuzzSharp.pdb", + "lib/net8.0-tvos17.0/HarfBuzzSharp.dll", + "lib/net8.0-tvos17.0/HarfBuzzSharp.pdb", + "lib/net8.0-windows10.0.19041/HarfBuzzSharp.dll", + "lib/net8.0-windows10.0.19041/HarfBuzzSharp.pdb", + "lib/net8.0/HarfBuzzSharp.dll", + "lib/net8.0/HarfBuzzSharp.pdb", + "lib/netstandard2.0/HarfBuzzSharp.dll", + "lib/netstandard2.0/HarfBuzzSharp.pdb", + "lib/netstandard2.1/HarfBuzzSharp.dll", + "lib/netstandard2.1/HarfBuzzSharp.pdb" + ] + }, + "HarfBuzzSharp.NativeAssets.Linux/8.3.1.1": { + "sha512": "3EZ1mpIiKWRLL5hUYA82ZHteeDIVaEA/Z0rA/wU6tjx6crcAkJnBPwDXZugBSfo8+J3EznvRJf49uMsqYfKrHg==", + "type": "package", + "path": "harfbuzzsharp.nativeassets.linux/8.3.1.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt", + "README.md", + "THIRD-PARTY-NOTICES.txt", + "buildTransitive/net462/HarfBuzzSharp.NativeAssets.Linux.targets", + "harfbuzzsharp.nativeassets.linux.8.3.1.1.nupkg.sha512", + "harfbuzzsharp.nativeassets.linux.nuspec", + "icon.png", + "lib/net462/_._", + "lib/net6.0/_._", + "lib/net8.0/_._", + "lib/netstandard2.0/_._", + "lib/netstandard2.1/_._", + "runtimes/linux-arm/native/libHarfBuzzSharp.so", + "runtimes/linux-arm64/native/libHarfBuzzSharp.so", + "runtimes/linux-loongarch64/native/libHarfBuzzSharp.so", + "runtimes/linux-musl-arm/native/libHarfBuzzSharp.so", + "runtimes/linux-musl-arm64/native/libHarfBuzzSharp.so", + "runtimes/linux-musl-loongarch64/native/libHarfBuzzSharp.so", + "runtimes/linux-musl-riscv64/native/libHarfBuzzSharp.so", + "runtimes/linux-musl-x64/native/libHarfBuzzSharp.so", + "runtimes/linux-riscv64/native/libHarfBuzzSharp.so", + "runtimes/linux-x64/native/libHarfBuzzSharp.so", + "runtimes/linux-x86/native/libHarfBuzzSharp.so" + ] + }, + "HarfBuzzSharp.NativeAssets.macOS/8.3.1.1": { + "sha512": "jbtCsgftcaFLCA13tVKo5iWdElJScrulLTKJre36O4YQTIlwDtPPqhRZNk+Y0vv4D1gxbscasGRucUDfS44ofQ==", + "type": "package", + "path": "harfbuzzsharp.nativeassets.macos/8.3.1.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt", + "README.md", + "THIRD-PARTY-NOTICES.txt", + "buildTransitive/net462/HarfBuzzSharp.NativeAssets.macOS.targets", + "buildTransitive/net8.0-macos14.0/HarfBuzzSharp.NativeAssets.macOS.targets", + "harfbuzzsharp.nativeassets.macos.8.3.1.1.nupkg.sha512", + "harfbuzzsharp.nativeassets.macos.nuspec", + "icon.png", + "lib/net462/_._", + "lib/net6.0/_._", + "lib/net8.0-macos14.0/_._", + "lib/net8.0/_._", + "lib/netstandard2.0/_._", + "lib/netstandard2.1/_._", + "runtimes/osx/native/libHarfBuzzSharp.dylib" + ] + }, + "HarfBuzzSharp.NativeAssets.WebAssembly/8.3.1.1": { + "sha512": "loJweK2u/mH/3C2zBa0ggJlITIszOkK64HLAZB7FUT670dTg965whLFYHDQo69NmC4+d9UN0icLC9VHidXaVCA==", + "type": "package", + "path": "harfbuzzsharp.nativeassets.webassembly/8.3.1.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt", + "README.md", + "THIRD-PARTY-NOTICES.txt", + "buildTransitive/netstandard1.0/HarfBuzzSharp.NativeAssets.WebAssembly.props", + "buildTransitive/netstandard1.0/HarfBuzzSharp.NativeAssets.WebAssembly.targets", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/2.0.23/libHarfBuzzSharp.a", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/2.0.6/libHarfBuzzSharp.a", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.12/mt,simd/libHarfBuzzSharp.a", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.12/mt/libHarfBuzzSharp.a", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.12/st,simd/libHarfBuzzSharp.a", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.12/st/libHarfBuzzSharp.a", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.34/mt,simd/libHarfBuzzSharp.a", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.34/mt/libHarfBuzzSharp.a", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.34/st,simd/libHarfBuzzSharp.a", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.34/st/libHarfBuzzSharp.a", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.56/mt,simd/libHarfBuzzSharp.a", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.56/mt/libHarfBuzzSharp.a", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.56/st,simd/libHarfBuzzSharp.a", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.56/st/libHarfBuzzSharp.a", + "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.7/libHarfBuzzSharp.a", + "harfbuzzsharp.nativeassets.webassembly.8.3.1.1.nupkg.sha512", + "harfbuzzsharp.nativeassets.webassembly.nuspec", + "icon.png", + "lib/net462/_._", + "lib/net6.0/_._", + "lib/net8.0/_._", + "lib/netstandard2.0/_._", + "lib/netstandard2.1/_._" + ] + }, + "HarfBuzzSharp.NativeAssets.Win32/8.3.1.1": { + "sha512": "UsJtQsfAJoFDZrXc4hCUfRPMqccfKZ0iumJ/upcUjz/cmsTgVFGNEL5yaJWmkqsuFYdMWbj/En5/kS4PFl9hBA==", + "type": "package", + "path": "harfbuzzsharp.nativeassets.win32/8.3.1.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt", + "README.md", + "THIRD-PARTY-NOTICES.txt", + "buildTransitive/net462/HarfBuzzSharp.NativeAssets.Win32.targets", + "harfbuzzsharp.nativeassets.win32.8.3.1.1.nupkg.sha512", + "harfbuzzsharp.nativeassets.win32.nuspec", + "icon.png", + "lib/net462/_._", + "lib/net6.0-windows10.0.19041/_._", + "lib/net6.0/_._", + "lib/net8.0-windows10.0.19041/_._", + "lib/net8.0/_._", + "lib/netstandard2.0/_._", + "lib/netstandard2.1/_._", + "runtimes/win-arm64/native/libHarfBuzzSharp.dll", + "runtimes/win-x64/native/libHarfBuzzSharp.dll", + "runtimes/win-x86/native/libHarfBuzzSharp.dll" + ] + }, + "MicroCom.Runtime/0.11.0": { + "sha512": "MEnrZ3UIiH40hjzMDsxrTyi8dtqB5ziv3iBeeU4bXsL/7NLSal9F1lZKpK+tfBRnUoDSdtcW3KufE4yhATOMCA==", + "type": "package", + "path": "microcom.runtime/0.11.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net5.0/MicroCom.Runtime.dll", + "lib/netstandard2.0/MicroCom.Runtime.dll", + "microcom.runtime.0.11.0.nupkg.sha512", + "microcom.runtime.nuspec" + ] + }, + "SkiaSharp/2.88.9": { + "sha512": "3MD5VHjXXieSHCleRLuaTXmL2pD0mB7CcOB1x2kA1I4bhptf4e3R27iM93264ZYuAq6mkUyX5XbcxnZvMJYc1Q==", + "type": "package", + "path": "skiasharp/2.88.9", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt", + "THIRD-PARTY-NOTICES.txt", + "interactive-extensions/dotnet/SkiaSharp.DotNet.Interactive.dll", + "lib/monoandroid1.0/SkiaSharp.dll", + "lib/monoandroid1.0/SkiaSharp.pdb", + "lib/monoandroid1.0/SkiaSharp.xml", + "lib/net462/SkiaSharp.dll", + "lib/net462/SkiaSharp.pdb", + "lib/net462/SkiaSharp.xml", + "lib/net6.0-android30.0/SkiaSharp.dll", + "lib/net6.0-android30.0/SkiaSharp.pdb", + "lib/net6.0-android30.0/SkiaSharp.xml", + "lib/net6.0-ios13.6/SkiaSharp.dll", + "lib/net6.0-ios13.6/SkiaSharp.pdb", + "lib/net6.0-ios13.6/SkiaSharp.xml", + "lib/net6.0-maccatalyst13.5/SkiaSharp.dll", + "lib/net6.0-maccatalyst13.5/SkiaSharp.pdb", + "lib/net6.0-maccatalyst13.5/SkiaSharp.xml", + "lib/net6.0-macos10.15/SkiaSharp.dll", + "lib/net6.0-macos10.15/SkiaSharp.pdb", + "lib/net6.0-macos10.15/SkiaSharp.xml", + "lib/net6.0-tizen7.0/SkiaSharp.dll", + "lib/net6.0-tizen7.0/SkiaSharp.pdb", + "lib/net6.0-tizen7.0/SkiaSharp.xml", + "lib/net6.0-tvos13.4/SkiaSharp.dll", + "lib/net6.0-tvos13.4/SkiaSharp.pdb", + "lib/net6.0-tvos13.4/SkiaSharp.xml", + "lib/net6.0/SkiaSharp.dll", + "lib/net6.0/SkiaSharp.pdb", + "lib/net6.0/SkiaSharp.xml", + "lib/netcoreapp3.1/SkiaSharp.dll", + "lib/netcoreapp3.1/SkiaSharp.pdb", + "lib/netcoreapp3.1/SkiaSharp.xml", + "lib/netstandard1.3/SkiaSharp.dll", + "lib/netstandard1.3/SkiaSharp.pdb", + "lib/netstandard1.3/SkiaSharp.xml", + "lib/netstandard2.0/SkiaSharp.dll", + "lib/netstandard2.0/SkiaSharp.pdb", + "lib/netstandard2.0/SkiaSharp.xml", + "lib/netstandard2.1/SkiaSharp.dll", + "lib/netstandard2.1/SkiaSharp.pdb", + "lib/netstandard2.1/SkiaSharp.xml", + "lib/tizen40/SkiaSharp.dll", + "lib/tizen40/SkiaSharp.pdb", + "lib/tizen40/SkiaSharp.xml", + "lib/uap10.0.10240/SkiaSharp.dll", + "lib/uap10.0.10240/SkiaSharp.pdb", + "lib/uap10.0.10240/SkiaSharp.xml", + "lib/uap10.0.16299/SkiaSharp.dll", + "lib/uap10.0.16299/SkiaSharp.pdb", + "lib/uap10.0.16299/SkiaSharp.xml", + "lib/xamarinios1.0/SkiaSharp.dll", + "lib/xamarinios1.0/SkiaSharp.pdb", + "lib/xamarinios1.0/SkiaSharp.xml", + "lib/xamarinmac2.0/SkiaSharp.dll", + "lib/xamarinmac2.0/SkiaSharp.pdb", + "lib/xamarinmac2.0/SkiaSharp.xml", + "lib/xamarintvos1.0/SkiaSharp.dll", + "lib/xamarintvos1.0/SkiaSharp.pdb", + "lib/xamarintvos1.0/SkiaSharp.xml", + "lib/xamarinwatchos1.0/SkiaSharp.dll", + "lib/xamarinwatchos1.0/SkiaSharp.pdb", + "lib/xamarinwatchos1.0/SkiaSharp.xml", + "skiasharp.2.88.9.nupkg.sha512", + "skiasharp.nuspec" + ] + }, + "SkiaSharp.NativeAssets.Linux/2.88.9": { + "sha512": "cWSaJKVPWAaT/WIn9c8T5uT/l4ETwHxNJTkEOtNKjphNo8AW6TF9O32aRkxqw3l8GUdUo66Bu7EiqtFh/XG0Zg==", + "type": "package", + "path": "skiasharp.nativeassets.linux/2.88.9", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt", + "THIRD-PARTY-NOTICES.txt", + "build/net462/SkiaSharp.NativeAssets.Linux.targets", + "buildTransitive/net462/SkiaSharp.NativeAssets.Linux.targets", + "lib/net462/_._", + "lib/net6.0/_._", + "lib/netcoreapp3.1/_._", + "lib/netstandard1.3/_._", + "runtimes/linux-arm/native/libSkiaSharp.so", + "runtimes/linux-arm64/native/libSkiaSharp.so", + "runtimes/linux-musl-x64/native/libSkiaSharp.so", + "runtimes/linux-x64/native/libSkiaSharp.so", + "skiasharp.nativeassets.linux.2.88.9.nupkg.sha512", + "skiasharp.nativeassets.linux.nuspec" + ] + }, + "SkiaSharp.NativeAssets.macOS/2.88.9": { + "sha512": "Nv5spmKc4505Ep7oUoJ5vp3KweFpeNqxpyGDWyeEPTX2uR6S6syXIm3gj75dM0YJz7NPvcix48mR5laqs8dPuA==", + "type": "package", + "path": "skiasharp.nativeassets.macos/2.88.9", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt", + "THIRD-PARTY-NOTICES.txt", + "build/net462/SkiaSharp.NativeAssets.macOS.targets", + "build/net6.0-macos10.15/SkiaSharp.NativeAssets.macOS.targets", + "build/xamarinmac2.0/SkiaSharp.NativeAssets.macOS.targets", + "buildTransitive/net462/SkiaSharp.NativeAssets.macOS.targets", + "buildTransitive/net6.0-macos10.15/SkiaSharp.NativeAssets.macOS.targets", + "buildTransitive/xamarinmac2.0/SkiaSharp.NativeAssets.macOS.targets", + "lib/net462/_._", + "lib/net6.0-macos10.15/_._", + "lib/net6.0/_._", + "lib/netcoreapp3.1/_._", + "lib/netstandard1.3/_._", + "lib/xamarinmac2.0/_._", + "runtimes/osx/native/libSkiaSharp.dylib", + "skiasharp.nativeassets.macos.2.88.9.nupkg.sha512", + "skiasharp.nativeassets.macos.nuspec" + ] + }, + "SkiaSharp.NativeAssets.WebAssembly/2.88.9": { + "sha512": "kt06RccBHSnAs2wDYdBSfsjIDbY3EpsOVqnlDgKdgvyuRA8ZFDaHRdWNx1VHjGgYzmnFCGiTJBnXFl5BqGwGnA==", + "type": "package", + "path": "skiasharp.nativeassets.webassembly/2.88.9", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt", + "THIRD-PARTY-NOTICES.txt", + "build/netstandard1.0/SkiaSharp.NativeAssets.WebAssembly.props", + "build/netstandard1.0/SkiaSharp.NativeAssets.WebAssembly.targets", + "build/netstandard1.0/libSkiaSharp.a/2.0.23/libSkiaSharp.a", + "build/netstandard1.0/libSkiaSharp.a/2.0.6/libSkiaSharp.a", + "build/netstandard1.0/libSkiaSharp.a/3.1.12/mt,simd/libSkiaSharp.a", + "build/netstandard1.0/libSkiaSharp.a/3.1.12/mt/libSkiaSharp.a", + "build/netstandard1.0/libSkiaSharp.a/3.1.12/simd/libSkiaSharp.a", + "build/netstandard1.0/libSkiaSharp.a/3.1.12/st/libSkiaSharp.a", + "build/netstandard1.0/libSkiaSharp.a/3.1.34/mt/libSkiaSharp.a", + "build/netstandard1.0/libSkiaSharp.a/3.1.34/simd,mt/libSkiaSharp.a", + "build/netstandard1.0/libSkiaSharp.a/3.1.34/simd,st/libSkiaSharp.a", + "build/netstandard1.0/libSkiaSharp.a/3.1.34/st/libSkiaSharp.a", + "build/netstandard1.0/libSkiaSharp.a/3.1.56/mt/libSkiaSharp.a", + "build/netstandard1.0/libSkiaSharp.a/3.1.56/simd,mt/libSkiaSharp.a", + "build/netstandard1.0/libSkiaSharp.a/3.1.56/simd,st/libSkiaSharp.a", + "build/netstandard1.0/libSkiaSharp.a/3.1.56/st/libSkiaSharp.a", + "build/netstandard1.0/libSkiaSharp.a/3.1.7/libSkiaSharp.a", + "buildTransitive/netstandard1.0/SkiaSharp.NativeAssets.WebAssembly.props", + "buildTransitive/netstandard1.0/SkiaSharp.NativeAssets.WebAssembly.targets", + "lib/netstandard1.0/_._", + "skiasharp.nativeassets.webassembly.2.88.9.nupkg.sha512", + "skiasharp.nativeassets.webassembly.nuspec" + ] + }, + "SkiaSharp.NativeAssets.Win32/2.88.9": { + "sha512": "wb2kYgU7iy84nQLYZwMeJXixvK++GoIuECjU4ECaUKNuflyRlJKyiRhN1MAHswvlvzuvkrjRWlK0Za6+kYQK7w==", + "type": "package", + "path": "skiasharp.nativeassets.win32/2.88.9", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt", + "THIRD-PARTY-NOTICES.txt", + "build/net462/SkiaSharp.NativeAssets.Win32.targets", + "buildTransitive/net462/SkiaSharp.NativeAssets.Win32.targets", + "lib/net462/_._", + "lib/net6.0/_._", + "lib/netcoreapp3.1/_._", + "lib/netstandard1.3/_._", + "runtimes/win-arm64/native/libSkiaSharp.dll", + "runtimes/win-x64/native/libSkiaSharp.dll", + "runtimes/win-x86/native/libSkiaSharp.dll", + "skiasharp.nativeassets.win32.2.88.9.nupkg.sha512", + "skiasharp.nativeassets.win32.nuspec" + ] + }, + "System.IO.Pipelines/8.0.0": { + "sha512": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", + "type": "package", + "path": "system.io.pipelines/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.IO.Pipelines.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.IO.Pipelines.targets", + "lib/net462/System.IO.Pipelines.dll", + "lib/net462/System.IO.Pipelines.xml", + "lib/net6.0/System.IO.Pipelines.dll", + "lib/net6.0/System.IO.Pipelines.xml", + "lib/net7.0/System.IO.Pipelines.dll", + "lib/net7.0/System.IO.Pipelines.xml", + "lib/net8.0/System.IO.Pipelines.dll", + "lib/net8.0/System.IO.Pipelines.xml", + "lib/netstandard2.0/System.IO.Pipelines.dll", + "lib/netstandard2.0/System.IO.Pipelines.xml", + "system.io.pipelines.8.0.0.nupkg.sha512", + "system.io.pipelines.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "Tmds.DBus.Protocol/0.21.2": { + "sha512": "ScSMrUrrw8px4kK1Glh0fZv/HQUlg1078bNXNPfRPKQ3WbRzV9HpsydYEOgSoMK5LWICMf2bMwIFH0pGjxjcMA==", + "type": "package", + "path": "tmds.dbus.protocol/0.21.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net6.0/Tmds.DBus.Protocol.dll", + "lib/net8.0/Tmds.DBus.Protocol.dll", + "lib/netstandard2.0/Tmds.DBus.Protocol.dll", + "lib/netstandard2.1/Tmds.DBus.Protocol.dll", + "tmds.dbus.protocol.0.21.2.nupkg.sha512", + "tmds.dbus.protocol.nuspec" + ] + } + }, + "projectFileDependencyGroups": { + "net9.0": [ + "Avalonia >= 11.3.2", + "Avalonia.Desktop >= 11.3.2", + "Avalonia.Diagnostics >= 11.3.2", + "Avalonia.Fonts.Inter >= 11.3.2", + "Avalonia.Themes.Fluent >= 11.3.2", + "CommunityToolkit.Mvvm >= 8.2.1" + ] + }, + "packageFolders": { + "C:\\Users\\CatilGrass\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "D:\\rorolala-vcs\\rola-desktop\\rola-desktop.csproj", + "projectName": "rola-desktop", + "projectPath": "D:\\rorolala-vcs\\rola-desktop\\rola-desktop.csproj", + "packagesPath": "C:\\Users\\CatilGrass\\.nuget\\packages\\", + "outputPath": "D:\\rorolala-vcs\\rola-desktop\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\CatilGrass\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net9.0" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net9.0": { + "targetAlias": "net9.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "9.0.300" + }, + "frameworks": { + "net9.0": { + "targetAlias": "net9.0", + "dependencies": { + "Avalonia": { + "target": "Package", + "version": "[11.3.2, )" + }, + "Avalonia.Desktop": { + "target": "Package", + "version": "[11.3.2, )" + }, + "Avalonia.Diagnostics": { + "target": "Package", + "version": "[11.3.2, )" + }, + "Avalonia.Fonts.Inter": { + "target": "Package", + "version": "[11.3.2, )" + }, + "Avalonia.Themes.Fluent": { + "target": "Package", + "version": "[11.3.2, )" + }, + "CommunityToolkit.Mvvm": { + "target": "Package", + "version": "[8.2.1, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.303/PortableRuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/rola-desktop/obj/project.nuget.cache b/rola-desktop/obj/project.nuget.cache new file mode 100644 index 0000000..6082b1f --- /dev/null +++ b/rola-desktop/obj/project.nuget.cache @@ -0,0 +1,38 @@ +{ + "version": 2, + "dgSpecHash": "S8+NG6iu9uA=", + "success": true, + "projectFilePath": "D:\\rorolala-vcs\\rola-desktop\\rola-desktop.csproj", + "expectedPackageFiles": [ + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia\\11.3.2\\avalonia.11.3.2.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.angle.windows.natives\\2.1.25547.20250602\\avalonia.angle.windows.natives.2.1.25547.20250602.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.buildservices\\0.0.31\\avalonia.buildservices.0.0.31.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.controls.colorpicker\\11.3.2\\avalonia.controls.colorpicker.11.3.2.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.desktop\\11.3.2\\avalonia.desktop.11.3.2.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.diagnostics\\11.3.2\\avalonia.diagnostics.11.3.2.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.fonts.inter\\11.3.2\\avalonia.fonts.inter.11.3.2.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.freedesktop\\11.3.2\\avalonia.freedesktop.11.3.2.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.native\\11.3.2\\avalonia.native.11.3.2.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.remote.protocol\\11.3.2\\avalonia.remote.protocol.11.3.2.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.skia\\11.3.2\\avalonia.skia.11.3.2.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.themes.fluent\\11.3.2\\avalonia.themes.fluent.11.3.2.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.themes.simple\\11.3.2\\avalonia.themes.simple.11.3.2.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.win32\\11.3.2\\avalonia.win32.11.3.2.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.x11\\11.3.2\\avalonia.x11.11.3.2.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\communitytoolkit.mvvm\\8.2.1\\communitytoolkit.mvvm.8.2.1.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\harfbuzzsharp\\8.3.1.1\\harfbuzzsharp.8.3.1.1.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\harfbuzzsharp.nativeassets.linux\\8.3.1.1\\harfbuzzsharp.nativeassets.linux.8.3.1.1.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\harfbuzzsharp.nativeassets.macos\\8.3.1.1\\harfbuzzsharp.nativeassets.macos.8.3.1.1.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\harfbuzzsharp.nativeassets.webassembly\\8.3.1.1\\harfbuzzsharp.nativeassets.webassembly.8.3.1.1.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\harfbuzzsharp.nativeassets.win32\\8.3.1.1\\harfbuzzsharp.nativeassets.win32.8.3.1.1.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\microcom.runtime\\0.11.0\\microcom.runtime.0.11.0.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\skiasharp\\2.88.9\\skiasharp.2.88.9.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\skiasharp.nativeassets.linux\\2.88.9\\skiasharp.nativeassets.linux.2.88.9.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\skiasharp.nativeassets.macos\\2.88.9\\skiasharp.nativeassets.macos.2.88.9.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\skiasharp.nativeassets.webassembly\\2.88.9\\skiasharp.nativeassets.webassembly.2.88.9.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\skiasharp.nativeassets.win32\\2.88.9\\skiasharp.nativeassets.win32.2.88.9.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\system.io.pipelines\\8.0.0\\system.io.pipelines.8.0.0.nupkg.sha512", + "C:\\Users\\CatilGrass\\.nuget\\packages\\tmds.dbus.protocol\\0.21.2\\tmds.dbus.protocol.0.21.2.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/rola-desktop/obj/rola-desktop.csproj.nuget.dgspec.json b/rola-desktop/obj/rola-desktop.csproj.nuget.dgspec.json new file mode 100644 index 0000000..a198228 --- /dev/null +++ b/rola-desktop/obj/rola-desktop.csproj.nuget.dgspec.json @@ -0,0 +1,95 @@ +{ + "format": 1, + "restore": { + "D:\\rorolala-vcs\\rola-desktop\\rola-desktop.csproj": {} + }, + "projects": { + "D:\\rorolala-vcs\\rola-desktop\\rola-desktop.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "D:\\rorolala-vcs\\rola-desktop\\rola-desktop.csproj", + "projectName": "rola-desktop", + "projectPath": "D:\\rorolala-vcs\\rola-desktop\\rola-desktop.csproj", + "packagesPath": "C:\\Users\\CatilGrass\\.nuget\\packages\\", + "outputPath": "D:\\rorolala-vcs\\rola-desktop\\obj\\", + "projectStyle": "PackageReference", + "configFilePaths": [ + "C:\\Users\\CatilGrass\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net9.0" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net9.0": { + "targetAlias": "net9.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "9.0.300" + }, + "frameworks": { + "net9.0": { + "targetAlias": "net9.0", + "dependencies": { + "Avalonia": { + "target": "Package", + "version": "[11.3.2, )" + }, + "Avalonia.Desktop": { + "target": "Package", + "version": "[11.3.2, )" + }, + "Avalonia.Diagnostics": { + "target": "Package", + "version": "[11.3.2, )" + }, + "Avalonia.Fonts.Inter": { + "target": "Package", + "version": "[11.3.2, )" + }, + "Avalonia.Themes.Fluent": { + "target": "Package", + "version": "[11.3.2, )" + }, + "CommunityToolkit.Mvvm": { + "target": "Package", + "version": "[8.2.1, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.303/PortableRuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/rola-desktop/obj/rola-desktop.csproj.nuget.g.props b/rola-desktop/obj/rola-desktop.csproj.nuget.g.props new file mode 100644 index 0000000..f8f7537 --- /dev/null +++ b/rola-desktop/obj/rola-desktop.csproj.nuget.g.props @@ -0,0 +1,24 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\CatilGrass\.nuget\packages\ + PackageReference + 6.14.0 + + + + + + + + + + + C:\Users\CatilGrass\.nuget\packages\avalonia.buildservices\0.0.31 + C:\Users\CatilGrass\.nuget\packages\avalonia\11.3.2 + + \ No newline at end of file diff --git a/rola-desktop/obj/rola-desktop.csproj.nuget.g.targets b/rola-desktop/obj/rola-desktop.csproj.nuget.g.targets new file mode 100644 index 0000000..8eca98f --- /dev/null +++ b/rola-desktop/obj/rola-desktop.csproj.nuget.g.targets @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/rola-desktop/rola-desktop.csproj b/rola-desktop/rola-desktop.csproj new file mode 100644 index 0000000..a1155d6 --- /dev/null +++ b/rola-desktop/rola-desktop.csproj @@ -0,0 +1,28 @@ + + + WinExe + net9.0 + enable + true + app.manifest + true + + + + + + + + + + + + + + + None + All + + + + diff --git a/rola-utils/functions/Cargo.toml b/rola-utils/functions/Cargo.toml new file mode 100644 index 0000000..dd482c4 --- /dev/null +++ b/rola-utils/functions/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "shared_functions" +version.workspace = true +edition.workspace = true +authors.workspace = true +license.workspace = true + +[dependencies] diff --git a/rola-utils/functions/src/levenshtein_distance.rs b/rola-utils/functions/src/levenshtein_distance.rs new file mode 100644 index 0000000..7b8be6c --- /dev/null +++ b/rola-utils/functions/src/levenshtein_distance.rs @@ -0,0 +1,117 @@ +pub struct LevenshteinDistance; + +impl LevenshteinDistance { + pub fn filter_similar<'a>(str: &str, slice: &[&'a str], threshold: usize) -> Vec<&'a str> { + slice + .iter() + .filter(|s| levenshtein_distance(str, s) <= threshold) + .copied() + .collect() + } + + pub fn compare(a: impl AsRef, b: impl AsRef) -> usize { + let a = a.as_ref(); + let b = b.as_ref(); + levenshtein_distance(a, b) + } +} + +fn levenshtein_distance(a: &str, b: &str) -> usize { + let a_chars: Vec = a.chars().collect(); + let b_chars: Vec = b.chars().collect(); + let m = a_chars.len(); + let n = b_chars.len(); + if m == 0 { + return n; + } + if n == 0 { + return m; + } + + let mut prev: Vec = (0..=n).collect(); + let mut curr = vec![0; n + 1]; + for (i, ca) in a_chars.iter().enumerate() { + curr[0] = i + 1; + for (j, cb) in b_chars.iter().enumerate() { + let cost = if ca == cb { 0 } else { 1 }; + let del = prev[j + 1] + 1; + let ins = curr[j] + 1; + let rep = prev[j] + cost; + curr[j + 1] = del.min(ins).min(rep); + } + std::mem::swap(&mut prev, &mut curr); + } + prev[n] +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_levenshtein_distance_identical_strings() { + assert_eq!(LevenshteinDistance::compare("hello", "hello"), 0); + } + + #[test] + fn test_levenshtein_distance_completely_different() { + let dist = LevenshteinDistance::compare("abc", "xyz"); + assert_eq!(dist, 3); + } + + #[test] + fn test_levenshtein_distance_one_insertion() { + assert_eq!(LevenshteinDistance::compare("cat", "cats"), 1); + } + + #[test] + fn test_levenshtein_distance_one_deletion() { + assert_eq!(LevenshteinDistance::compare("dogs", "dog"), 1); + } + + #[test] + fn test_levenshtein_distance_one_substitution() { + assert_eq!(LevenshteinDistance::compare("cat", "cut"), 1); + } + + #[test] + fn test_levenshtein_distance_empty_strings() { + assert_eq!(LevenshteinDistance::compare("", ""), 0); + } + + #[test] + fn test_levenshtein_distance_empty_vs_nonempty() { + assert_eq!(LevenshteinDistance::compare("", "abc"), 3); + assert_eq!(LevenshteinDistance::compare("xyz", ""), 3); + } + + #[test] + fn test_levenshtein_distance_unicode() { + // Chinese characters + assert_eq!(LevenshteinDistance::compare("你好", "你好"), 0); + assert_eq!(LevenshteinDistance::compare("你好", "您好"), 1); + assert_eq!(LevenshteinDistance::compare("你好", "您不好"), 2); + } + + #[test] + fn test_filter_similar_exact_threshold() { + let words = vec!["cat", "cart", "ca", "cats", "cut"]; + let result = LevenshteinDistance::filter_similar("cat", &words, 2); + // cat -> cat: 0, cat -> cart: 1, cat -> ca: 1, cat -> cats: 1, cat -> cut: 1 + assert_eq!(result.len(), 5); + } + + #[test] + fn test_filter_similar_empty_slice() { + let words: Vec<&str> = vec![]; + let result = LevenshteinDistance::filter_similar("hello", &words, 3); + assert!(result.is_empty()); + } + + #[test] + fn test_filter_similar_threshold_zero() { + let words = vec!["hello", "hallo", "hello!"]; + let result = LevenshteinDistance::filter_similar("hello", &words, 0); + assert_eq!(result, vec!["hello"]); + } +} diff --git a/rola-utils/functions/src/lib.rs b/rola-utils/functions/src/lib.rs new file mode 100644 index 0000000..ff2ee7e --- /dev/null +++ b/rola-utils/functions/src/lib.rs @@ -0,0 +1,2 @@ +mod levenshtein_distance; +pub use levenshtein_distance::*; diff --git a/rola-utils/macros/Cargo.toml b/rola-utils/macros/Cargo.toml new file mode 100644 index 0000000..f750afa --- /dev/null +++ b/rola-utils/macros/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "shared_macros" +version.workspace = true +edition.workspace = true +authors.workspace = true +license.workspace = true + +[lib] +proc-macro = true + +[dependencies] +syn = { version = "2.0", features = ["full", "visit-mut"] } +quote = "1.0" +proc-macro2 = "1.0" diff --git a/rola-utils/macros/src/lib.rs b/rola-utils/macros/src/lib.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/rola-utils/macros/src/lib.rs @@ -0,0 +1 @@ + diff --git a/rola-vcs/Cargo.toml b/rola-vcs/Cargo.toml new file mode 100644 index 0000000..6fec629 --- /dev/null +++ b/rola-vcs/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "rorolala" +version.workspace = true +authors.workspace = true +license.workspace = true +edition.workspace = true + +[dependencies] +rorolala_internal_macros.workspace = true diff --git a/rola-vcs/internal_macros/Cargo.toml b/rola-vcs/internal_macros/Cargo.toml new file mode 100644 index 0000000..0d6f641 --- /dev/null +++ b/rola-vcs/internal_macros/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "rorolala_internal_macros" +version.workspace = true +authors.workspace = true +license.workspace = true +edition.workspace = true + +[lib] +proc-macro = true + +[dependencies] +syn = { version = "2", features = ["full"] } +quote = "1" +proc-macro2 = "1" diff --git a/rola-vcs/internal_macros/src/constants.rs b/rola-vcs/internal_macros/src/constants.rs new file mode 100644 index 0000000..2e76bfe --- /dev/null +++ b/rola-vcs/internal_macros/src/constants.rs @@ -0,0 +1,115 @@ +use proc_macro::TokenStream; +use quote::{format_ident, quote}; +use syn::{Expr, Item, ItemConst, ItemMod, Lit, parse_macro_input, parse_quote}; + +/// Entry point called from lib.rs. +pub fn expand(_attr: TokenStream, item: TokenStream) -> TokenStream { + let mut input_mod = parse_macro_input!(item as ItemMod); + + let (_, items) = match &mut input_mod.content { + Some(content) => content, + None => panic!("#[constants] can only be applied to a module with a body"), + }; + + let mut new_items: Vec = Vec::with_capacity(items.len()); + + for item in items.iter() { + if let Item::Const(const_item) = item { + let func = transform_const(const_item); + new_items.push(func); + } else { + new_items.push(item.clone()); + } + } + + let mod_ident = &input_mod.ident; + let vis = &input_mod.vis; + + let output = quote! { + #[allow(non_snake_case)] + #vis mod #mod_ident { + #(#new_items)* + } + }; + + output.into() +} + +/// Transforms a single `const` item into a function. +fn transform_const(const_item: &ItemConst) -> Item { + let name = &const_item.ident; + let attrs = &const_item.attrs; + + // Extract the string literal value from the const + let value_str = match &*const_item.expr { + Expr::Lit(expr_lit) => match &expr_lit.lit { + Lit::Str(lit_str) => lit_str.value(), + _ => panic!( + "#[constants] only supports `&str` literals, \ + but `{name}` has a non-string literal" + ), + }, + _ => panic!( + "#[constants] only supports literal expressions, \ + but `{name}` has a non-literal expression" + ), + }; + + let placeholders = extract_placeholders(&value_str); + + if placeholders.is_empty() { + parse_quote! { + #(#attrs)* + pub fn #name() -> String { + #value_str.to_string() + } + } + } else { + let params: Vec<_> = placeholders + .iter() + .map(|p| { + let ident = format_ident!("{p}"); + quote! { #ident: impl ::core::convert::AsRef } + }) + .collect(); + + let format_args: Vec<_> = placeholders + .iter() + .map(|p| { + let ident = format_ident!("{p}"); + quote! { #ident = #ident.as_ref() } + }) + .collect(); + + parse_quote! { + #(#attrs)* + pub fn #name(#(#params),*) -> String { + ::std::format!(#value_str, #(#format_args),*) + } + } + } +} + +/// Extracts all `{name}` placeholder identifiers from a format string. +fn extract_placeholders(s: &str) -> Vec { + let mut placeholders = Vec::new(); + let mut chars = s.char_indices().peekable(); + + while let Some((_, c)) = chars.next() { + if c == '{' { + let mut name = String::new(); + for (_, c) in &mut chars { + if c == '}' { + break; + } + name.push(c); + } + let trimmed = name.trim().to_string(); + if !trimmed.is_empty() { + placeholders.push(trimmed); + } + } + } + + placeholders +} diff --git a/rola-vcs/internal_macros/src/lib.rs b/rola-vcs/internal_macros/src/lib.rs new file mode 100644 index 0000000..f6c3cb7 --- /dev/null +++ b/rola-vcs/internal_macros/src/lib.rs @@ -0,0 +1,39 @@ +mod constants; + +use proc_macro::TokenStream; + +/// Transforms `pub const` items in a module into equivalent functions. +/// +/// Constants without `{param}` placeholders become `fn NAME() -> String`. +/// Constants with `{param}` placeholders become `fn NAME(param: impl AsRef) -> String`, +/// using `format!()` to fill in the placeholders. +/// +/// The entire module is annotated with `#[allow(non_snake_case)]`. +/// +/// # Example +/// +/// ```ignore +/// #[rorolala_internal_macros::constants] +/// pub mod paths { +/// pub const ROLA_DRAFT_DIR: &str = ".rola"; +/// pub const ROLA_BINDED_BUCKET_FILE: &str = ".rola/BIND/{bucket}"; +/// } +/// ``` +/// +/// expands to: +/// +/// ```ignore +/// #[allow(non_snake_case)] +/// pub mod paths { +/// pub fn ROLA_DRAFT_DIR() -> String { +/// ".rola".to_string() +/// } +/// pub fn ROLA_BINDED_BUCKET_FILE(bucket: impl AsRef) -> String { +/// format!(".rola/BIND/{bucket}", bucket = bucket.as_ref()) +/// } +/// } +/// ``` +#[proc_macro_attribute] +pub fn constants(attr: TokenStream, item: TokenStream) -> TokenStream { + constants::expand(attr, item) +} diff --git a/rola-vcs/src/abstracts.rs b/rola-vcs/src/abstracts.rs new file mode 100644 index 0000000..e707ec3 --- /dev/null +++ b/rola-vcs/src/abstracts.rs @@ -0,0 +1,2 @@ +mod dir_pointer; +pub use dir_pointer::*; diff --git a/rola-vcs/src/abstracts/dir_pointer.rs b/rola-vcs/src/abstracts/dir_pointer.rs new file mode 100644 index 0000000..0e59960 --- /dev/null +++ b/rola-vcs/src/abstracts/dir_pointer.rs @@ -0,0 +1,88 @@ +use std::{ + borrow::Borrow, + ops::{Deref, DerefMut}, + path::PathBuf, +}; + +/// Directory Pointer Data +pub trait DirPtrData { + /// Fix the given path + /// + /// Returns Some(path): use the fixed path + /// Returns None: path cannot be fixed, this pointer is invalid + #[doc(hidden)] + fn fix(raw_path: PathBuf) -> Option; +} + +#[derive(Debug, Default, Clone)] +pub struct DirPtr { + /// Whether the current directory pointer is valid + valid: bool, + + /// Data for the directory pointer + data: Data, + + /// Path to the directory + path: PathBuf, +} + +impl DirPtr { + /// Get a reference to the directory pointer's path + pub fn path_ref(&self) -> &PathBuf { + &self.path + } + + /// Get the directory pointer's path + pub fn path(&self) -> PathBuf { + self.path.clone() + } + + /// Returns whether the directory pointer is valid + pub fn is_valid(&self) -> bool { + self.valid + } +} + +impl DirPtr { + /// Create a new directory pointer with the given path and default data + pub fn new(path: impl Into) -> Self { + let path = path.into(); + let fixed = Data::fix(path.clone()); + Self { + valid: fixed.is_some(), + data: Data::default(), + path: fixed.unwrap_or(path), + } + } +} + +impl AsRef> for DirPtr { + fn as_ref(&self) -> &DirPtr { + self + } +} + +impl Deref for DirPtr { + type Target = Data; + + fn deref(&self) -> &Self::Target { + &self.data + } +} + +impl DerefMut for DirPtr { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.data + } +} + +impl Borrow for DirPtr { + fn borrow(&self) -> &Data { + &self.data + } +} + +/// Create a new directory pointer with the given path and default data +pub fn dir_ptr(path: impl Into) -> DirPtr { + DirPtr::new(path) +} diff --git a/rola-vcs/src/bucket.rs b/rola-vcs/src/bucket.rs new file mode 100644 index 0000000..40de6f8 --- /dev/null +++ b/rola-vcs/src/bucket.rs @@ -0,0 +1,18 @@ +//! Bucket - Rorolala Storage Unit + +use crate::{ + DirPtrData, DirSearchPattern, bucket::constants::ROLA_BUCKET_CONFIG_FILE, dir_search_prev, +}; + +pub mod constants { + /// The name of the bucket config file + pub const ROLA_BUCKET_CONFIG_FILE: &str = "rorolala.toml"; +} + +pub struct Bucket; + +impl DirPtrData for Bucket { + fn fix(raw_path: std::path::PathBuf) -> Option { + dir_search_prev(raw_path, DirSearchPattern::File(ROLA_BUCKET_CONFIG_FILE)) + } +} diff --git a/rola-vcs/src/err.rs b/rola-vcs/src/err.rs new file mode 100644 index 0000000..71e0a34 --- /dev/null +++ b/rola-vcs/src/err.rs @@ -0,0 +1,105 @@ +//! Error +//! +//! This module is used to create and log Rorolala standard errors + +use std::{ + fmt::{Display, Formatter}, + io::Error as IoError, +}; + +mod io; + +/// Rorolala standard error +#[derive(Default)] +pub struct RolaError { + pub module: RolaModule, + pub data: RolaErrorData, + pub message: String, +} + +/// Rorolala module, used to locate the source of an error +#[derive(Debug, Eq, Default)] +#[repr(u8)] +pub enum RolaModule { + #[default] + Empty, + + Bucket, + Workdraft, +} + +/// Error data +#[derive(Debug, Default)] +pub enum RolaErrorData { + #[default] + Empty, + + /// IO error + IO(IoError), +} + +impl RolaError { + /// Create a new RolaError + pub fn new(module: RolaModule, data: RolaErrorData, message: String) -> Self { + Self { + module, + data, + message, + } + } + + /// Create an empty RolaError + pub fn empty() -> Self { + Self { + module: RolaModule::Empty, + data: RolaErrorData::Empty, + message: String::new(), + } + } + + /// Set the module + pub fn with_module(mut self, module: RolaModule) -> Self { + self.module = module; + self + } + + /// Set the message + pub fn with_message(mut self, message: String) -> Self { + self.message = message; + self + } + + /// Set the error data + pub fn with_data(mut self, data: RolaErrorData) -> Self { + self.data = data; + self + } +} + +impl Display for RolaError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.message) + } +} + +impl PartialEq for RolaError { + fn eq(&self, other: &Self) -> bool { + self.message == other.message && self.module == other.module + } +} + +impl Display for RolaModule { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self) + } +} + +impl PartialEq for RolaModule { + fn eq(&self, other: &Self) -> bool { + matches!( + (self, other), + (RolaModule::Bucket, RolaModule::Bucket) + | (RolaModule::Workdraft, RolaModule::Workdraft) + ) + } +} diff --git a/rola-vcs/src/err/io.rs b/rola-vcs/src/err/io.rs new file mode 100644 index 0000000..8dd4c1a --- /dev/null +++ b/rola-vcs/src/err/io.rs @@ -0,0 +1,10 @@ +use crate::{RolaError, RolaErrorData, RolaModule}; + +impl From<(RolaModule, std::io::Error)> for RolaError { + fn from(val: (RolaModule, std::io::Error)) -> Self { + let (module, io_err) = val; + let message = io_err.to_string(); + let data = RolaErrorData::IO(io_err); + RolaError::new(module, data, message) + } +} diff --git a/rola-vcs/src/lib.rs b/rola-vcs/src/lib.rs new file mode 100644 index 0000000..7672ff9 --- /dev/null +++ b/rola-vcs/src/lib.rs @@ -0,0 +1,24 @@ +#![allow(dead_code)] + +mod bucket; + +mod abstracts; +pub use abstracts::*; + +mod workdraft; +pub use workdraft::*; + +mod tools; +pub use tools::*; + +mod err; +pub use err::*; + +#[doc(hidden)] +#[macro_export] +macro_rules! include_mod { + ($module:ident) => { + mod $module; + pub use $module::*; + }; +} diff --git a/rola-vcs/src/tools.rs b/rola-vcs/src/tools.rs new file mode 100644 index 0000000..43b4e33 --- /dev/null +++ b/rola-vcs/src/tools.rs @@ -0,0 +1 @@ +crate::include_mod!(dir_search); diff --git a/rola-vcs/src/tools/dir_search.rs b/rola-vcs/src/tools/dir_search.rs new file mode 100644 index 0000000..3d32c70 --- /dev/null +++ b/rola-vcs/src/tools/dir_search.rs @@ -0,0 +1,54 @@ +use std::path::PathBuf; + +pub enum DirSearchPattern<'a> { + File(&'a str), + Dir(&'a str), +} + +/// Searches upward from the given path towards parent directories. +/// If any ancestor directory contains a file or directory matching the pattern, +/// returns that ancestor directory's path. +pub fn dir_search_prev(path: impl Into, pattern: DirSearchPattern) -> Option { + let mut current: PathBuf = path.into(); + // Canonicalize the path if possible to ensure absolute traversal + if let Ok(canonical) = current.canonicalize() { + current = canonical; + } else { + // If canonicalization fails (e.g. path does not exist yet), + // try to make it absolute using current dir + if current.is_relative() + && let Ok(cwd) = std::env::current_dir() { + current = cwd.join(¤t); + } + } + + loop { + // Check if the current directory exists and is a directory + if current.is_dir() { + let has_match = match &pattern { + DirSearchPattern::File(name) => { + let mut entry = current.clone(); + entry.push(name); + entry.is_file() + } + DirSearchPattern::Dir(name) => { + let mut entry = current.clone(); + entry.push(name); + entry.is_dir() + } + }; + + if has_match { + return Some(current); + } + } + + // Try to go to the parent directory + if !current.pop() { + // pop() returns false when there's no parent + break; + } + } + + None +} diff --git a/rola-vcs/src/workdraft.rs b/rola-vcs/src/workdraft.rs new file mode 100644 index 0000000..45bb418 --- /dev/null +++ b/rola-vcs/src/workdraft.rs @@ -0,0 +1,150 @@ +//! Work Draft +//! +//! Work Draft is the local workspace of `Rorolala`, used to store files being modified + +use std::path::PathBuf; + +use crate::{ + DirPtrData, DirSearchPattern, RolaError, RolaModule, dir_search_prev, + workdraft::constants::ROLA_DRAFT_DIR, +}; + +#[rorolala_internal_macros::constants] +pub mod constants { + /// The name of the workdraft directory + pub const ROLA_DRAFT_DIR: &str = ".rola"; + + /// The name of the directory containing bucket bindings + pub const ROLA_BINDED_BUCKETS_DIR: &str = ".rola/BIND/"; + + /// The name of the bind file + pub const ROLA_BINDED_BUCKET_FILE: &str = ".rola/BIND/{bucket}"; +} + +/// Work Draft Pointer +/// +/// This struct is used to point to an operable local work draft directory on disk +#[derive(Debug, Default, Clone)] +pub struct WorkDraft; + +impl DirPtrData for WorkDraft { + fn fix(raw_path: PathBuf) -> Option { + let draft_dir = ROLA_DRAFT_DIR(); + dir_search_prev(raw_path, DirSearchPattern::Dir(&draft_dir)) + } +} + +impl WorkDraft { + /// Creates a new work draft directory at the given path + pub fn create(path: PathBuf) -> Result<(), RolaError> { + let dir = path.join(ROLA_DRAFT_DIR()); + std::fs::create_dir_all(dir).map_err(|e| RolaError::from((RolaModule::Workdraft, e)))?; + Ok(()) + } +} + +/// Module for managing workdraft bucket bindings +pub mod bucket_bind_mgr { + use std::path::PathBuf; + + use crate::{ + DirPtr, RolaError, RolaModule, WorkDraft, constants::ROLA_BINDED_BUCKETS_DIR, + workdraft::constants::ROLA_BINDED_BUCKET_FILE, + }; + + impl DirPtr { + /// Returns the path to the bind file for this work draft + pub fn bind_bucket_path(&self, bucket: impl AsRef) -> PathBuf { + self.path().join(ROLA_BINDED_BUCKET_FILE(bucket)) + } + + /// Returns the path to the bind file for this work draft + pub fn bind_bucket(&self, bucket: impl AsRef) -> Result { + let bucket_path = self.bind_bucket_path(bucket); + let parent = bucket_path.parent().ok_or_else(|| -> RolaError { + RolaError::from(( + RolaModule::Workdraft, + std::io::Error::new( + std::io::ErrorKind::InvalidInput, + format!("Invalid bucket path: {}", bucket_path.to_string_lossy()), + ), + )) + })?; + + if !parent.exists() { + std::fs::create_dir_all(parent) + .map_err(|e| RolaError::from((RolaModule::Workdraft, e)))?; + } + + match std::fs::read_to_string(bucket_path) { + Ok(str) => Ok(str), + Err(err) => Err(RolaError::from((RolaModule::Workdraft, err))), + } + } + + /// Binds the work draft to the specified bucket + pub fn bind_bucket_to(&self, bucket: &str) -> Result<(), RolaError> { + let bucket_path = self.bind_bucket_path(bucket); + let parent = bucket_path.parent().ok_or_else(|| -> RolaError { + RolaError::from(( + RolaModule::Workdraft, + std::io::Error::new(std::io::ErrorKind::InvalidInput, "invalid bucket path"), + )) + })?; + if !parent.exists() { + std::fs::create_dir_all(parent) + .map_err(|e| RolaError::from((RolaModule::Workdraft, e)))?; + } + std::fs::write(&bucket_path, bucket) + .map_err(|e| RolaError::from((RolaModule::Workdraft, e)))?; + Ok(()) + } + + /// Returns all bound bucket names for this work draft + pub fn binded_buckets(&self) -> Result, RolaError> { + let bind_dir = self.path().join(ROLA_BINDED_BUCKETS_DIR()); + if !bind_dir.exists() { + return Ok(Vec::new()); + } + + let mut buckets = Vec::new(); + let entries = std::fs::read_dir(&bind_dir) + .map_err(|e| RolaError::from((RolaModule::Workdraft, e)))?; + + for entry in entries { + let entry = entry.map_err(|e| RolaError::from((RolaModule::Workdraft, e)))?; + let path = entry.path(); + + if path.is_file() { + // Read the file content which contains the bucket name + if let Ok(content) = std::fs::read_to_string(&path) { + let bucket = content.trim().to_string(); + if !bucket.is_empty() { + buckets.push(bucket); + } + } + } + } + + Ok(buckets) + } + + /// Removes the binding for the specified bucket + pub fn unbind_bucket(&self, bucket: impl AsRef) -> Result<(), RolaError> { + let bucket_path = self.bind_bucket_path(bucket); + if bucket_path.exists() { + std::fs::remove_file(&bucket_path) + .map_err(|e| RolaError::from((RolaModule::Workdraft, e)))?; + } + Ok(()) + } + + /// Removes bindings for all specified buckets + pub fn unbind_buckets(&self, buckets: &[impl AsRef]) -> Result<(), RolaError> { + for bucket in buckets { + self.unbind_bucket(bucket)?; + } + Ok(()) + } + } +} -- cgit