/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License 2.0 
 *  which accompanies this distribution, and is available at
 *  https://www.eclipse.org/legal/epl-2.0/
 * 
 *  SPDX-License-Identifier: EPL-2.0
 *  
 *  Contributors:                                                      
 *     Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 *  
 *  generated from ActionDSL.xcore
 * 
 *  
 */
package org.eclipse.osbp.xtext.action;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.eclipse.emf.common.util.Enumerator;

/**
 * <!-- begin-user-doc -->
 * A representation of the literals of the enumeration '<em><b>Datainterchange Action Enum</b></em>',
 * and utility methods for working with them.
 * <!-- end-user-doc -->
 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getDatainterchangeActionEnum()
 * @model
 * @generated
 */
public enum DatainterchangeActionEnum implements Enumerator {
	/**
	 * The '<em><b>DATAINTERCHANGE ACTION IMPORT</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #DATAINTERCHANGE_ACTION_IMPORT_VALUE
	 * @generated
	 * @ordered
	 */
	DATAINTERCHANGE_ACTION_IMPORT(0, "DATAINTERCHANGE_ACTION_IMPORT", "Import"),

	/**
	 * The '<em><b>DATAINTERCHANGE ACTION EXPORT</b></em>' literal object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #DATAINTERCHANGE_ACTION_EXPORT_VALUE
	 * @generated
	 * @ordered
	 */
	DATAINTERCHANGE_ACTION_EXPORT(0, "DATAINTERCHANGE_ACTION_EXPORT", "Export");

	/**
	 * The '<em><b>DATAINTERCHANGE ACTION IMPORT</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of '<em><b>DATAINTERCHANGE ACTION IMPORT</b></em>' literal object isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @see #DATAINTERCHANGE_ACTION_IMPORT
	 * @model literal="Import"
	 * @generated
	 * @ordered
	 */
	public static final int DATAINTERCHANGE_ACTION_IMPORT_VALUE = 0;

	/**
	 * The '<em><b>DATAINTERCHANGE ACTION EXPORT</b></em>' literal value.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of '<em><b>DATAINTERCHANGE ACTION EXPORT</b></em>' literal object isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @see #DATAINTERCHANGE_ACTION_EXPORT
	 * @model literal="Export"
	 * @generated
	 * @ordered
	 */
	public static final int DATAINTERCHANGE_ACTION_EXPORT_VALUE = 0;

	/**
	 * An array of all the '<em><b>Datainterchange Action Enum</b></em>' enumerators.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private static final DatainterchangeActionEnum[] VALUES_ARRAY =
		new DatainterchangeActionEnum[] {
			DATAINTERCHANGE_ACTION_IMPORT,
			DATAINTERCHANGE_ACTION_EXPORT,
		};

	/**
	 * A public read-only list of all the '<em><b>Datainterchange Action Enum</b></em>' enumerators.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public static final List<DatainterchangeActionEnum> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));

	/**
	 * Returns the '<em><b>Datainterchange Action Enum</b></em>' literal with the specified literal value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param literal the literal.
	 * @return the matching enumerator or <code>null</code>.
	 * @generated
	 */
	public static DatainterchangeActionEnum get(String literal) {
		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
			DatainterchangeActionEnum result = VALUES_ARRAY[i];
			if (result.toString().equals(literal)) {
				return result;
			}
		}
		return null;
	}

	/**
	 * Returns the '<em><b>Datainterchange Action Enum</b></em>' literal with the specified name.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param name the name.
	 * @return the matching enumerator or <code>null</code>.
	 * @generated
	 */
	public static DatainterchangeActionEnum getByName(String name) {
		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
			DatainterchangeActionEnum result = VALUES_ARRAY[i];
			if (result.getName().equals(name)) {
				return result;
			}
		}
		return null;
	}

	/**
	 * Returns the '<em><b>Datainterchange Action Enum</b></em>' literal with the specified integer value.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the integer value.
	 * @return the matching enumerator or <code>null</code>.
	 * @generated
	 */
	public static DatainterchangeActionEnum get(int value) {
		switch (value) {
			case DATAINTERCHANGE_ACTION_IMPORT_VALUE: return DATAINTERCHANGE_ACTION_IMPORT;
		}
		return null;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private final int value;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private final String name;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private final String literal;

	/**
	 * Only this class can construct instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private DatainterchangeActionEnum(int value, String name, String literal) {
		this.value = value;
		this.name = name;
		this.literal = literal;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public int getValue() {
	  return value;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String getName() {
	  return name;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String getLiteral() {
	  return literal;
	}

	/**
	 * Returns the literal value of the enumerator, which is its string representation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String toString() {
		return literal;
	}
	
} //DatainterchangeActionEnum
