示例#1
0
 public Token(TokenTypeName t_name, object val)
 {
     type_name    = t_name;
     value_object = val;
 }
示例#2
0
        public CsdlToken(string tokenText, string alternativeName)
        {
            if (string.IsNullOrWhiteSpace(tokenText))
            {
                throw new ArgumentNullException(nameof(tokenText));
            }

            TokenText = tokenText;

            var separatorIndex = tokenText.IndexOf(NAME_TYPE_SEPARATOR);

            if (separatorIndex >= 0)
            {
                Name = tokenText.Substring(0, separatorIndex);

                if (string.IsNullOrEmpty(Name) ||
                    Name.Equals(CONTEXTUAL_TOKEN.ToString(CultureInfo.InvariantCulture),
                                StringComparison.OrdinalIgnoreCase))
                {
                    Name = alternativeName;
                }

                if (Name.EndsWith(CONTEXTUAL_TOKEN.ToString(CultureInfo.InvariantCulture)))
                {
                    IsContextual = true;
                    Name         = Name.TrimEnd(CONTEXTUAL_TOKEN);
                }

                // Checks if the token has an initializator, that changes its instance properties.
                var tokenTypeInitializator = tokenText.Substring(separatorIndex + 1,
                                                                 tokenText.Length - separatorIndex - 1);
                var initializatorStartIndex = tokenTypeInitializator.IndexOf(INITIALIZATOR_START);

                if (initializatorStartIndex >= 0)
                {
                    TokenTypeName             = tokenTypeInitializator.Substring(0, initializatorStartIndex);
                    TokenPropertiesDictionary = new Dictionary <string, string>();

                    var initializatorEndIndex = tokenTypeInitializator.LastIndexOf(INITIALIZATOR_END);
                    var initializatorValues   =
                        tokenTypeInitializator.Substring(initializatorStartIndex + 1,
                                                         initializatorEndIndex - initializatorStartIndex - 1).Trim();

                    // Check if the initialization content is a JSON
                    if (initializatorValues.Length > 0 &&
                        initializatorValues[0] == JSON_TOKEN_TYPE_PROPERTY_START &&
                        initializatorValues[initializatorValues.Length - 1] == JSON_TOKEN_TYPE_PROPERTY_END)
                    {
                        var jobject = JObject.Parse(initializatorValues);

                        foreach (var jtoken in jobject)
                        {
                            TokenPropertiesDictionary.Add(jtoken.Key, jtoken.Value.ToString());
                        }
                    }
                    else if (!string.IsNullOrWhiteSpace(initializatorValues))
                    {
                        TokenPropertiesDictionary.Add(DEFAULT_TOKEN_TYPE_PROPERTY,
                                                      initializatorValues.Trim(DEFAULT_TOKEN_TYPE_PROPERTY_DELIMITER));
                    }
                }
                else
                {
                    TokenTypeName = tokenTypeInitializator;
                }

                if (TokenTypeName.EndsWith(OPTIONAL_TOKEN.ToString(CultureInfo.InvariantCulture)))
                {
                    IsOptional    = true;
                    TokenTypeName = TokenTypeName.TrimEnd(OPTIONAL_TOKEN);
                }

                if (TokenTypeName.EndsWith(INVERT_PARSING_TOKEN.ToString(CultureInfo.InvariantCulture)))
                {
                    InvertParsing = true;
                    TokenTypeName = TokenTypeName.TrimEnd(INVERT_PARSING_TOKEN);
                }
            }
            else
            {
                throw new ArgumentException($"Could not find the name type separator on token '{tokenText}'");
            }
        }