| File: DefaultPathInfo.cs | Web Access |
| Project: src\sdk\src\TemplateEngine\Microsoft.TemplateEngine.Edge\Microsoft.TemplateEngine.Edge.csproj (Microsoft.TemplateEngine.Edge) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Runtime.InteropServices; using Microsoft.TemplateEngine.Abstractions; namespace Microsoft.TemplateEngine.Edge { /// <summary> /// Default implementation of <see cref="IPathInfo"/>. If custom settings location are not passed, the following locations to be used: <br/> /// - global settings: [user profile directory]/.templateengine <br/> /// - host settings: [user profile directory]/.templateengine/[<see cref="ITemplateEngineHost.HostIdentifier"/>] <br/> /// - host version settings: [user profile directory]/.templateengine/[<see cref="ITemplateEngineHost.HostIdentifier"/>]/[<see cref="ITemplateEngineHost.Version"/>]. /// </summary> public sealed class DefaultPathInfo : IPathInfo { /// <summary> /// Creates the instance. /// </summary> /// <param name="environment"><see cref="IEnvironment"/> implementation to be used to get location of user profile directory.</param> /// <param name="host"><see cref="ITemplateEngineHost"/> implementation.</param> /// <param name="globalSettingsDir"> /// If specified, the directory will be used for storing global settings. /// Default location: [user profile directory]/.templateengine. /// </param> /// <param name="hostSettingsDir"> /// If specified, the directory will be used for storing host settings. /// Default location: host settings: [user profile directory]/.templateengine/[<see cref="ITemplateEngineHost.HostIdentifier"/>]. /// </param> /// <param name="hostVersionSettingsDir"> /// If specified, the directory will be used for storing host version settings. /// Default location: host settings: [user profile directory]/.templateengine/[<see cref="ITemplateEngineHost.HostIdentifier"/>]/[<see cref="ITemplateEngineHost.Version"/>]. /// </param> public DefaultPathInfo( IEnvironment environment, ITemplateEngineHost host, string? globalSettingsDir = null, string? hostSettingsDir = null, string? hostVersionSettingsDir = null) { UserProfileDir = GetUserProfileDir(environment); if (string.IsNullOrWhiteSpace(globalSettingsDir)) { globalSettingsDir = GetDefaultGlobalSettingsDir(UserProfileDir); } GlobalSettingsDir = globalSettingsDir!; if (string.IsNullOrWhiteSpace(hostSettingsDir)) { hostSettingsDir = GetDefaultHostSettingsDir(host, userDir: UserProfileDir); } HostSettingsDir = hostSettingsDir!; if (string.IsNullOrWhiteSpace(hostVersionSettingsDir)) { hostVersionSettingsDir = GetDefaultHostVersionSettingsDir(host, userDir: UserProfileDir); } HostVersionSettingsDir = hostVersionSettingsDir!; } internal DefaultPathInfo( IEngineEnvironmentSettings engineEnvironmentSettings, string? settingsLocation) { UserProfileDir = GetUserProfileDir(engineEnvironmentSettings.Environment); GlobalSettingsDir = string.IsNullOrWhiteSpace(settingsLocation) ? GetDefaultGlobalSettingsDir(UserProfileDir) : settingsLocation!; HostSettingsDir = GetDefaultHostSettingsDir(engineEnvironmentSettings.Host, globalDir: GlobalSettingsDir); HostVersionSettingsDir = GetDefaultHostVersionSettingsDir(engineEnvironmentSettings.Host, globalDir: GlobalSettingsDir); } /// <inheritdoc/> public string UserProfileDir { get; } /// <summary> /// Gets global settings directory. /// If not specified via constructor, the default location is [<see cref="UserProfileDir"/>]/.templateengine. /// </summary> public string GlobalSettingsDir { get; } /// <summary> /// Gets host settings directory. /// If not specified via constructor, the default location is [<see cref="GlobalSettingsDir"/>]/[host identifier]. /// </summary> public string HostSettingsDir { get; } /// <summary> /// Gets host version settings directory. /// If not specified via constructor, the default location is [<see cref="GlobalSettingsDir"/>]/[host identifier]/[host version]. /// </summary> public string HostVersionSettingsDir { get; } private static string GetUserProfileDir(IEnvironment environment) { bool isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); return environment.GetEnvironmentVariable(isWindows ? "USERPROFILE" : "HOME") ?? throw new NotSupportedException("HOME or USERPROFILE environment variable is not defined, the environment is not supported"); } private static string GetDefaultGlobalSettingsDir(string userDir) { return Path.Combine(userDir, ".templateengine"); } private static string GetDefaultHostSettingsDir(ITemplateEngineHost host, string? userDir = null, string? globalDir = null) { if (string.IsNullOrWhiteSpace(host.HostIdentifier)) { throw new ArgumentException($"{nameof(host.HostIdentifier)} of {nameof(host)} cannot be null or whitespace.", nameof(host)); } if (string.IsNullOrWhiteSpace(userDir) && string.IsNullOrWhiteSpace(globalDir)) { throw new ArgumentException($"both {nameof(userDir)} and {nameof(globalDir)} cannot be null or whitespace.", nameof(userDir)); } return Path.Combine(globalDir ?? GetDefaultGlobalSettingsDir(userDir!), host.HostIdentifier); } private static string GetDefaultHostVersionSettingsDir(ITemplateEngineHost host, string? userDir = null, string? globalDir = null) { if (string.IsNullOrWhiteSpace(host.HostIdentifier)) { throw new ArgumentException($"{nameof(host.HostIdentifier)} of {nameof(host)} cannot be null or whitespace.", nameof(host)); } if (string.IsNullOrWhiteSpace(host.Version)) { throw new ArgumentException($"{nameof(host.Version)} of {nameof(host)} cannot be null or whitespace.", nameof(host)); } if (string.IsNullOrWhiteSpace(userDir) && string.IsNullOrWhiteSpace(globalDir)) { throw new ArgumentException($"both {nameof(userDir)} and {nameof(globalDir)} cannot be null or whitespace.", nameof(userDir)); } return Path.Combine(globalDir ?? GetDefaultGlobalSettingsDir(userDir!), host.HostIdentifier, host.Version); } } }