#region CPL License /* Nuclex Framework Copyright (C) 2002-2017 Nuclex Development Labs This library is free software; you can redistribute it and/or modify it under the terms of the IBM Common Public License as published by the IBM Corporation; either version 1.0 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the IBM Common Public License for more details. You should have received a copy of the IBM Common Public License along with this library */ #endregion using System; using System.Collections.Generic; using System.Diagnostics; namespace Nuclex.Support.Parsing { partial class CommandLine { /// Argument being specified on an application's command line public class Argument { /// Initializes a new option with only a name /// /// String segment with the entire argument as it was given on the command line /// /// Absolute index the argument name starts at /// Number of characters in the option name /// The newly created option internal static Argument OptionOnly( StringSegment raw, int nameStart, int nameLength ) { return new Argument(raw, nameStart, nameLength, -1, -1); } /// Initializes a new argument with only a value /// /// String segment with the entire argument as it was given on the command line /// /// Absolute index the value starts at /// Number of characters in the value /// The newly created option internal static Argument ValueOnly( StringSegment raw, int valueStart, int valueLength ) { return new Argument(raw, -1, -1, valueStart, valueLength); } /// Creates a new option with a name and an assigned value /// /// String segment containing the entire option as it was given on the command line /// /// Absolute index the option name starts at /// Number of characters in the option name /// Absolute index the value starts at /// Number of characters in the value /// The newly created option internal Argument( StringSegment raw, int nameStart, int nameLength, int valueStart, int valueLength ) { this.raw = raw; this.nameStart = nameStart; this.nameLength = nameLength; this.valueStart = valueStart; this.valueLength = valueLength; } /// Contains the raw string the command line argument was parsed from public string Raw { get { return this.raw.ToString(); } } /// Characters used to initiate this option public string Initiator { get { if(this.nameStart == -1) { return null; } else { return this.raw.Text.Substring( this.raw.Offset, this.nameStart - this.raw.Offset ); } } } /// Name of the command line option public string Name { get { if(this.nameStart == -1) { return null; } else { return this.raw.Text.Substring(this.nameStart, this.nameLength); } } } /// Characters used to associate a value to this option public string Associator { get { if(this.nameStart == -1) { return null; } else { int associatorStart = this.nameStart + this.nameLength; if(this.valueStart == -1) { int characterCount = (this.raw.Offset + this.raw.Count) - associatorStart; if(characterCount == 0) { return null; } } else if(this.valueStart == associatorStart) { return null; } return this.raw.Text.Substring(associatorStart, 1); } } } /// Name of the command line option public string Value { get { if(this.valueStart == -1) { return null; } else { return this.raw.Text.Substring(this.valueStart, this.valueLength); } } } /// The raw length of the command line argument internal int RawLength { get { return this.raw.Count; } } /// /// Contains the entire option as it was specified on the command line /// private StringSegment raw; /// Absolute index in the raw string the option name starts at private int nameStart; /// Number of characters in the option name private int nameLength; /// Absolute index in the raw string the value starts at private int valueStart; /// Number of characters in the value private int valueLength; } } } // namespace Nuclex.Support.Parsing