/// <summary> /// Writes the specified end token. /// </summary> /// <param name="token">The end token to write.</param> protected virtual void WriteEnd(EdiToken token) { switch (token) { case EdiToken.SegmentStart: WriteSegmentTerminator(); break; } }
/// <summary> /// Check to see if the given <see cref="EdiToken"/> represents the begining of a structural container. /// </summary> /// <param name="token">The token to check</param> /// <returns></returns> public static bool IsStartToken(this EdiToken token) { switch (token) { case EdiToken.SegmentStart: case EdiToken.ElementStart: case EdiToken.ComponentStart: return(true); default: return(false); } }
/// <summary> /// Check to see if the given <see cref="EdiToken"/> represents primitive value type. /// </summary> /// <param name="token">The token to check</param> /// <returns></returns> public static bool IsPrimitiveToken(this EdiToken token) { switch (token) { case EdiToken.Integer: case EdiToken.Float: case EdiToken.String: case EdiToken.Boolean: case EdiToken.Null: case EdiToken.Date: return(true); default: return(false); } }
internal void AutoComplete(EdiToken tokenBeingWritten) { // gets new state based on the current state and what is being written State newState = StateArray[(int)tokenBeingWritten][(int)_currentState]; if (newState == State.Error) { throw EdiWriterException.Create(this, "Token {0} in state {1} would result in an invalid Edi object.".FormatWith(CultureInfo.InvariantCulture, tokenBeingWritten.ToString(), _currentState.ToString()), null); } if ((_currentState == State.Element || _currentState == State.Component || _currentState == State.Value || _currentState == State.SegmentName) && tokenBeingWritten == EdiToken.SegmentName) { AutoCompleteClose(EdiContainerType.Segment); } else if (_currentState == State.SegmentName && tokenBeingWritten.IsPrimitiveToken()) { Push(EdiContainerType.Element); Push(EdiContainerType.Component); } else if (_currentState == State.Element && tokenBeingWritten.IsPrimitiveToken()) { Push(EdiContainerType.Component); } else if (_currentState == State.Value && tokenBeingWritten.IsPrimitiveToken()) { AutoCompleteClose(EdiContainerType.Component); WriteComponentDelimiter(); Push(EdiContainerType.Component); } else if ((_currentState == State.Component || _currentState == State.Value) && tokenBeingWritten == EdiToken.ElementStart) { AutoCompleteClose(EdiContainerType.Element); } else if ((_currentState == State.Component || _currentState == State.Value) && tokenBeingWritten == EdiToken.ComponentStart) { AutoCompleteClose(EdiContainerType.Component); } _currentState = newState; }
/// <summary> /// Sets the state of the EdiWriter, /// </summary> /// <param name="token">The EdiToken being written.</param> /// <param name="value">The value being written.</param> protected void SetWriteState(EdiToken token, object value) { switch (token) { case EdiToken.SegmentStart: InternalWriteStart(token, EdiContainerType.Segment); break; case EdiToken.ElementStart: InternalWriteStart(token, EdiContainerType.Element); break; case EdiToken.ComponentStart: InternalWriteStart(token, EdiContainerType.Component); break; case EdiToken.SegmentName: if (!(value is string)) { throw new ArgumentException("A name is required when setting property name state.", nameof(value)); } InternalWriteSegmentName((string)value); break; case EdiToken.Integer: case EdiToken.Float: case EdiToken.String: case EdiToken.Boolean: case EdiToken.Date: case EdiToken.Null: InternalWriteValue(token); break; default: throw new ArgumentOutOfRangeException(nameof(token)); } }
public EdiEntry(string path, EdiToken token, string value) { Path = path; Value = value; Token = token; }
internal void InternalWriteValue(EdiToken token) { AutoComplete(token); }
/// <summary> /// Writes the <see cref="EdiToken"/> token and its value. /// </summary> /// <param name="token">The <see cref="EdiToken"/> to write.</param> /// <param name="value"> /// The value to write. /// A value is only required for tokens that have an associated value, e.g. the <see cref="String"/> segmanet name name for <see cref="EdiToken.SegmentName"/>. /// A null value can be passed to the method for token's that don't have a value, e.g. <see cref="EdiToken.SegmentStart"/>.</param> public void WriteToken(EdiToken token, object value) { switch (token) { case EdiToken.None: // read to next break; case EdiToken.SegmentStart: WriteSegmentTerminator(); break; case EdiToken.SegmentName: // read to next ValidationUtils.ArgumentNotNull(value, nameof(value)); WriteSegmentName(value.ToString()); break; case EdiToken.ElementStart: InternalWriteStart(EdiToken.ElementStart, EdiContainerType.Element); WriteElementDelimiter(); break; case EdiToken.ComponentStart: InternalWriteStart(EdiToken.ComponentStart, EdiContainerType.Component); WriteComponentDelimiter(); break; case EdiToken.Integer: ValidationUtils.ArgumentNotNull(value, nameof(value)); #if !PORTABLE if (value is BigInteger) { WriteValue((BigInteger)value); } else #endif { WriteValue(Convert.ToInt64(value, CultureInfo.InvariantCulture)); } break; case EdiToken.Float: ValidationUtils.ArgumentNotNull(value, nameof(value)); if (value is decimal) { WriteValue((decimal)value); } else if (value is double) { WriteValue((double)value); } else if (value is float) { WriteValue((float)value); } else { WriteValue(Convert.ToDouble(value, CultureInfo.InvariantCulture)); } break; case EdiToken.String: ValidationUtils.ArgumentNotNull(value, nameof(value)); WriteValue(value.ToString()); break; case EdiToken.Boolean: ValidationUtils.ArgumentNotNull(value, nameof(value)); WriteValue(Convert.ToBoolean(value, CultureInfo.InvariantCulture)); break; case EdiToken.Null: WriteNull(); break; case EdiToken.Date: ValidationUtils.ArgumentNotNull(value, nameof(value)); if (value is DateTimeOffset) { WriteValue((DateTimeOffset)value); } else { WriteValue(Convert.ToDateTime(value, CultureInfo.InvariantCulture)); } break; default: throw new ArgumentOutOfRangeException(nameof(token), token, "Unexpected token type."); } }
internal void InternalWriteStart(EdiToken token, EdiContainerType container) { AutoComplete(token); Push(container); }
internal void SetToken(EdiToken newToken, object value, bool updateIndex) { _tokenType = newToken; _value = value; switch (newToken) { case EdiToken.SegmentStart: while (Peek() > EdiContainerType.Segment) { Pop(); } if (Peek() == EdiContainerType.None) { Push(EdiContainerType.Segment); } if (updateIndex) { IncrementPosition(); } _currentState = State.SegmentStart; break; case EdiToken.ElementStart: while (Peek() > EdiContainerType.Element) { Pop(); } if (Peek() == EdiContainerType.Segment) { Push(EdiContainerType.Element); } if (updateIndex) { IncrementPosition(); } _currentState = State.ElementStart; break; case EdiToken.ComponentStart: while (Peek() > EdiContainerType.Component) { Pop(); } if (Peek() == EdiContainerType.Element) { Push(EdiContainerType.Component); } if (updateIndex) { IncrementPosition(); } _currentState = State.ComponentStart; break; case EdiToken.SegmentName: _currentState = State.SegmentName; _currentPosition.SegmentName = (string)value; break; case EdiToken.String: case EdiToken.Integer: case EdiToken.Float: case EdiToken.Boolean: case EdiToken.Date: case EdiToken.Null: SetPostValueState(); break; } if (newToken.IsStartToken()) { _Path = GetCurrentPath(); } }
/// <summary> /// Changes the <see cref="State"/> to Closed. /// </summary> public virtual void Close() { _currentState = State.Closed; _tokenType = EdiToken.None; _value = null; }
/// <summary> /// Sets the current token and value. /// </summary> /// <param name="newToken">The new token.</param> /// <param name="value">The value.</param> protected void SetToken(EdiToken newToken, object value) { SetToken(newToken, value, true); }
/// <summary> /// Sets the current token. /// </summary> /// <param name="newToken">The new token.</param> protected void SetToken(EdiToken newToken) { SetToken(newToken, null, true); }
/// <summary> /// Writes the <see cref="EdiToken"/> token. /// </summary> /// <param name="token">The <see cref="EdiToken"/> to write.</param> public void WriteToken(EdiToken token) { WriteToken(token, null); }