Compare commits

...

1 Commits

Author SHA1 Message Date
Yu Leng (from Dev Box)
b62f3da7ac init 2025-04-24 18:10:19 +08:00
11 changed files with 63 additions and 14 deletions

View File

@@ -10,7 +10,7 @@ namespace Microsoft.CmdPal.Common.Extensions;
/// <summary>
/// Extension class implementing extension methods for <see cref="Application"/>.
/// </summary>
public static class ApplicationExtensions
public static partial class ApplicationExtensions
{
/// <summary>
/// Get registered services at the application level from anywhere in the

View File

@@ -3,17 +3,18 @@
// See the LICENSE file in the project root for more information.
using System;
using System.Diagnostics.CodeAnalysis;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace Microsoft.CmdPal.Common.Extensions;
public static class IHostExtensions
public static partial class IHostExtensions
{
/// <summary>
/// <inheritdoc cref="ActivatorUtilities.CreateInstance(IServiceProvider, Type, object[])"/>
/// </summary>
public static T CreateInstance<T>(this IHost host, params object[] parameters)
public static T CreateInstance<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>(this IHost host, params object[] parameters)
{
return ActivatorUtilities.CreateInstance<T>(host.Services, parameters);
}

View File

@@ -2,14 +2,17 @@
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.IO;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization.Metadata;
using System.Threading.Tasks;
using Microsoft.CmdPal.Common.JsonSerilizerContext;
namespace Microsoft.CmdPal.Common.Helpers;
public static class Json
public static partial class Json
{
public static async Task<T> ToObjectAsync<T>(string value)
{
@@ -18,8 +21,14 @@ public static class Json
return (T)(object)bool.Parse(value);
}
JsonTypeInfo<T>? typeInfo = (JsonTypeInfo<T>?)CommonSerializationContext.Default.GetTypeInfo(typeof(T));
if (typeInfo == null)
{
throw new InvalidOperationException($"Type {typeof(T)} is not supported for deSerialization.");
}
await using var stream = new MemoryStream(Encoding.UTF8.GetBytes(value));
return (await JsonSerializer.DeserializeAsync<T>(stream))!;
return (await JsonSerializer.DeserializeAsync<T>(stream, typeInfo))!;
}
public static async Task<string> StringifyAsync<T>(T value)
@@ -29,8 +38,14 @@ public static class Json
return value!.ToString()!.ToLowerInvariant();
}
JsonTypeInfo<T>? typeInfo = (JsonTypeInfo<T>?)CommonSerializationContext.Default.GetTypeInfo(typeof(T));
if (typeInfo == null)
{
throw new InvalidOperationException($"Type {typeof(T)} is not supported for serialization.");
}
await using var stream = new MemoryStream();
await JsonSerializer.SerializeAsync(stream, value);
await JsonSerializer.SerializeAsync(stream, value, typeInfo);
return Encoding.UTF8.GetString(stream.ToArray());
}
}

View File

@@ -9,7 +9,7 @@ using Microsoft.UI.Dispatching;
namespace Microsoft.CmdPal.Common.Helpers;
public static class NativeEventWaiter
public static partial class NativeEventWaiter
{
public static void WaitForEventLoop(string eventName, Action callback)
{

View File

@@ -9,7 +9,7 @@ using Windows.Win32.Foundation;
namespace Microsoft.CmdPal.Common.Helpers;
public static class RuntimeHelper
public static partial class RuntimeHelper
{
public static bool IsMSIX
{

View File

@@ -0,0 +1,16 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.Text.Json.Serialization;
namespace Microsoft.CmdPal.Common.JsonSerilizerContext;
[JsonSerializable(typeof(float))]
[JsonSerializable(typeof(int))]
[JsonSerializable(typeof(string))]
[JsonSerializable(typeof(bool))]
[JsonSourceGenerationOptions(UseStringEnumConverter = true, WriteIndented = true, IncludeFields = true, PropertyNameCaseInsensitive = true, AllowTrailingCommas = true)]
internal sealed partial class CommonSerializationContext : JsonSerializerContext
{
}

View File

@@ -4,6 +4,6 @@
namespace Microsoft.CmdPal.Common.Messages;
public record HideWindowMessage()
public partial record HideWindowMessage()
{
}

View File

@@ -1,5 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\Common.Dotnet.CsWinRT.props" />
<Import Project="..\..\..\Common.Dotnet.AotCompatibility.props" />
<PropertyGroup>
<RootNamespace>Microsoft.CmdPal.Common</RootNamespace>
<Nullable>enable</Nullable>

View File

@@ -4,7 +4,7 @@
namespace Microsoft.CmdPal.Common.Models;
public class LocalSettingsOptions
public partial class LocalSettingsOptions
{
public string? ApplicationDataFolder
{

View File

@@ -2,14 +2,17 @@
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.IO;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization.Metadata;
using Microsoft.CmdPal.Common.Contracts;
using Microsoft.CmdPal.Common.JsonSerilizerContext;
namespace Microsoft.CmdPal.Common.Services;
public class FileService : IFileService
public partial class FileService : IFileService
{
private static readonly Encoding _encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false);
@@ -20,7 +23,14 @@ public class FileService : IFileService
if (File.Exists(path))
{
using var fileStream = File.OpenText(path);
return JsonSerializer.Deserialize<T>(fileStream.BaseStream);
JsonTypeInfo<T>? typeInfo = (JsonTypeInfo<T>?)CommonSerializationContext.Default.GetTypeInfo(typeof(T));
if (typeInfo == null)
{
throw new InvalidOperationException($"Type {typeof(T)} is not supported for deSerialization.");
}
return JsonSerializer.Deserialize<T>(fileStream.BaseStream, typeInfo);
}
return default;
@@ -34,7 +44,13 @@ public class FileService : IFileService
Directory.CreateDirectory(folderPath);
}
var fileContent = JsonSerializer.Serialize(content);
JsonTypeInfo<T>? typeInfo = (JsonTypeInfo<T>?)CommonSerializationContext.Default.GetTypeInfo(typeof(T));
if (typeInfo == null)
{
throw new InvalidOperationException($"Type {typeof(T)} is not supported for serialization.");
}
var fileContent = JsonSerializer.Serialize(content, typeInfo);
File.WriteAllText(Path.Combine(folderPath, fileName), fileContent, _encoding);
}

View File

@@ -14,7 +14,7 @@ using Windows.Storage;
namespace Microsoft.CmdPal.Common.Services;
public class LocalSettingsService : ILocalSettingsService
public partial class LocalSettingsService : ILocalSettingsService
{
// TODO! for now, we're hardcoding the path as effectively:
// %localappdata%\CmdPal\LocalSettings.json