#region License

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

#endregion

// THIS IS A GENERATED FILE - DO NOT MODIFY THIS FILE DIRECTLY - see pom.xml
using System;
using System.Collections.Generic;

namespace Gremlin.Net.Process.Traversal
{
#pragma warning disable 1591

    public class <%= enumClass.simpleName %> : <%= implementedTypes %>
    {
        private <%= enumClass.simpleName %>(string enumValue)
            : base("<%= enumClass.simpleName %>", enumValue)
        {
        }
<%
    def toCSharpName = { enumClass, itemName ->
        if (enumClass.equals(directionClass)) {
            itemName = itemName.toLowerCase()
        }

        return itemName.substring(0, 1).toUpperCase() + itemName.substring(1)
    }
    constants.each { value -> %>
        public static ${enumClass.simpleName} ${toCSharpName(enumClass, value.name())} => new ${enumClass.simpleName}("${value.name()}");
<%  }%>
        private static readonly IDictionary<string, <%= enumClass.simpleName %>> Properties = new Dictionary<string, <%= enumClass.simpleName %>>
        {<%  constants.each { value -> %>
            { "${value.name()}", ${toCSharpName(enumClass, value.name())} },<%  }%>
        };

        /// <summary>
        /// Gets the <%= enumClass.simpleName %> enumeration by value.
        /// </summary>
        public static <%= enumClass.simpleName %> GetByValue(string value)
        {
            if (!Properties.TryGetValue(value, out var property))
            {
                throw new ArgumentException(\$"No matching <%= enumClass.simpleName%> for value '{value}'");
            }
            return property;
        }
    }


#pragma warning restore 1591
}