Exemple #1
0
 /// <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;
     }
 }
Exemple #2
0
        /// <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);
            }
        }
Exemple #3
0
        /// <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);
            }
        }
Exemple #4
0
        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;
        }
Exemple #5
0
        /// <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));
            }
        }
Exemple #6
0
 public EdiEntry(string path, EdiToken token, string value)
 {
     Path  = path;
     Value = value;
     Token = token;
 }
Exemple #7
0
 public EdiEntry(string path, EdiToken token, string value) {
     Path = path;
     Value = value;
     Token = token;
 }
Exemple #8
0
 /// <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;
     }
 }
Exemple #9
0
        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;
        }
Exemple #10
0
 internal void InternalWriteValue(EdiToken token)
 {
     AutoComplete(token);
 }
Exemple #11
0
        /// <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.");
            }
        }
Exemple #12
0
 internal void InternalWriteStart(EdiToken token, EdiContainerType container) {
     AutoComplete(token);
     Push(container);
 }
Exemple #13
0
        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();
            }
        }
Exemple #14
0
 /// <summary>
 /// Changes the <see cref="State"/> to Closed. 
 /// </summary>
 public virtual void Close() {
     _currentState = State.Closed;
     _tokenType = EdiToken.None;
     _value = null;
 }
Exemple #15
0
 /// <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));
     }
 }
Exemple #16
0
        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();
            }
        } 
Exemple #17
0
 /// <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);
 }
Exemple #18
0
 /// <summary>
 /// Sets the current token.
 /// </summary>
 /// <param name="newToken">The new token.</param>
 protected void SetToken(EdiToken newToken) {
     SetToken(newToken, null, true);
 }
Exemple #19
0
 /// <summary>
 /// Sets the current token.
 /// </summary>
 /// <param name="newToken">The new token.</param>
 protected void SetToken(EdiToken newToken)
 {
     SetToken(newToken, null, true);
 }
Exemple #20
0
 internal void InternalWriteStart(EdiToken token, EdiContainerType container)
 {
     AutoComplete(token);
     Push(container);
 }
Exemple #21
0
 /// <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);
 }
Exemple #22
0
        /// <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.");
            }
        }
Exemple #23
0
 /// <summary>
 /// Changes the <see cref="State"/> to Closed.
 /// </summary>
 public virtual void Close()
 {
     _currentState = State.Closed;
     _tokenType    = EdiToken.None;
     _value        = null;
 }
Exemple #24
0
 /// <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);
 }
Exemple #25
0
 internal void InternalWriteValue(EdiToken token) {
     AutoComplete(token);
 }
Exemple #26
0
 /// <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);
 }