| File: TokenConfig.cs | Web Access |
| Project: src\sdk\src\TemplateEngine\Microsoft.TemplateEngine.Core\Microsoft.TemplateEngine.Core.csproj (Microsoft.TemplateEngine.Core) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Text; using Microsoft.TemplateEngine.Core.Contracts; namespace Microsoft.TemplateEngine.Core { public class TokenConfig : ITokenConfig { private TokenConfig(string? after, string? value, string? before) { After = after; Value = value; Before = before; } public string? After { get; } public string? Before { get; } public string? Value { get; } public static TokenConfig FromValue(string? value) { return new TokenConfig(null, value, null); } public static IToken LiteralToken(byte[] data, int start = 0, int end = -1) { int realEnd = end != -1 ? end : (data.Length - start - 1); return new Token(data, start, realEnd); } public TokenConfig OnlyIfAfter(string? prefix) { return new TokenConfig(prefix, Value, Before); } public TokenConfig OnlyIfBefore(string? suffix) { return new TokenConfig(After, Value, suffix); } public IToken ToToken(Encoding encoding) { byte[] pre = string.IsNullOrEmpty(After) ? [] : encoding.GetBytes(After); byte[] post = string.IsNullOrEmpty(Before) ? [] : encoding.GetBytes(Before); byte[] core = string.IsNullOrEmpty(Value) ? [] : encoding.GetBytes(Value); byte[] buffer = new byte[pre.Length + core.Length + post.Length]; if (pre.Length > 0) { Buffer.BlockCopy(pre, 0, buffer, 0, pre.Length); } if (core.Length > 0) { Buffer.BlockCopy(core, 0, buffer, pre.Length, core.Length); } if (post.Length > 0) { Buffer.BlockCopy(post, 0, buffer, pre.Length + core.Length, post.Length); } return new Token(buffer, pre.Length, buffer.Length - post.Length - 1); } public override bool Equals(object obj) { return Equals((obj as ITokenConfig)!); } public override int GetHashCode() { return (Before?.GetHashCode() ?? 0) ^ (After?.GetHashCode() ?? 0) ^ (Value?.GetHashCode() ?? 0); } public bool Equals(ITokenConfig other) { return other != null && string.Equals(other.Before, Before, StringComparison.Ordinal) && string.Equals(other.After, After, StringComparison.Ordinal) && string.Equals(other.Value, Value, StringComparison.Ordinal); } private class Token : IToken { public Token(byte[] value, int start, int end) { Value = value; Start = start; End = end; Length = End - Start + 1; } public byte[] Value { get; } public int Start { get; } public int End { get; } public int Length { get; } } } }