/ src / settings-ui / Settings.UI.Library / Utilities / CommandLineUtils.cs
CommandLineUtils.cs
 1  // Copyright (c) Microsoft Corporation
 2  // The Microsoft Corporation licenses this file to you under the MIT license.
 3  // See the LICENSE file in the project root for more information.
 4  
 5  using System;
 6  using System.Linq;
 7  using System.Reflection;
 8  
 9  using Microsoft.PowerToys.Settings.UI.Library.Interfaces;
10  
11  namespace Microsoft.PowerToys.Settings.UI.Library;
12  
13  public class CommandLineUtils
14  {
15      private static Type GetSettingsConfigType(string moduleName, Assembly settingsLibraryAssembly)
16      {
17          var settingsClassName = moduleName == "GeneralSettings" ? moduleName : moduleName + "Settings";
18          return settingsLibraryAssembly.GetType(typeof(CommandLineUtils).Namespace + "." + settingsClassName);
19      }
20  
21      public static ISettingsConfig GetSettingsConfigFor(string moduleName, SettingsUtils settingsUtils, Assembly settingsLibraryAssembly)
22      {
23          return GetSettingsConfigFor(GetSettingsConfigType(moduleName, settingsLibraryAssembly), settingsUtils);
24      }
25  
26      /// Executes SettingsRepository<moduleSettingsType>.GetInstance(settingsUtils).SettingsConfig
27      public static ISettingsConfig GetSettingsConfigFor(Type moduleSettingsType, SettingsUtils settingsUtils)
28      {
29          var genericSettingsRepositoryType = typeof(SettingsRepository<>);
30          var moduleSettingsRepositoryType = genericSettingsRepositoryType.MakeGenericType(moduleSettingsType);
31  
32          // Note: GeneralSettings is only used here only to satisfy nameof constrains, i.e. the choice of this particular type doesn't have any special significance.
33          var getInstanceInfo = moduleSettingsRepositoryType.GetMethod(nameof(SettingsRepository<GeneralSettings>.GetInstance));
34          var settingsRepository = getInstanceInfo.Invoke(null, new object[] { settingsUtils });
35          var settingsConfigProperty = getInstanceInfo.ReturnType.GetProperty(nameof(SettingsRepository<GeneralSettings>.SettingsConfig));
36          return settingsConfigProperty.GetValue(settingsRepository) as ISettingsConfig;
37      }
38  
39      public static Assembly GetSettingsAssembly()
40      {
41          return AppDomain.CurrentDomain.GetAssemblies()
42                          .FirstOrDefault(a => a.GetName().Name == "PowerToys.Settings.UI.Lib");
43      }
44  
45      public static object GetPropertyValue(string propertyName, ISettingsConfig settingsConfig)
46      {
47          var (settingInfo, properties) = LocateSetting(propertyName, settingsConfig);
48          return settingInfo.GetValue(properties);
49      }
50  
51      public static object GetProperties(ISettingsConfig settingsConfig)
52      {
53          var settingsType = settingsConfig.GetType();
54          if (settingsType == typeof(GeneralSettings))
55          {
56              return settingsConfig;
57          }
58  
59          var settingsConfigInfo = settingsType.GetProperty("Properties");
60          return settingsConfigInfo.GetValue(settingsConfig);
61      }
62  
63      public static (PropertyInfo SettingInfo, object Properties) LocateSetting(string propertyName, ISettingsConfig settingsConfig)
64      {
65          var properties = GetProperties(settingsConfig);
66          var propertiesType = properties.GetType();
67          if (propertiesType == typeof(GeneralSettings) && propertyName.StartsWith("Enabled.", StringComparison.InvariantCulture))
68          {
69              var moduleNameToToggle = propertyName.Replace("Enabled.", string.Empty);
70              properties = propertiesType.GetProperty("Enabled").GetValue(properties);
71              propertiesType = properties.GetType();
72              propertyName = moduleNameToToggle;
73          }
74  
75          return (propertiesType.GetProperty(propertyName), properties);
76      }
77  
78      public static PropertyInfo GetSettingPropertyInfo(string propertyName, ISettingsConfig settingsConfig)
79      {
80          return LocateSetting(propertyName, settingsConfig).SettingInfo;
81      }
82  }