001// Copyright (c) FIRST and other WPILib contributors.
002// Open Source Software; you can modify and/or share it under the terms of
003// the WPILib BSD license file in the root directory of this project.
004
005package edu.wpi.first.networktables;
006
007/** Network table data types. */
008public enum NetworkTableType {
009  /** Unassigned data type. */
010  kUnassigned(0, ""),
011  /** Boolean data type. */
012  kBoolean(0x01, "boolean"),
013  /** Double precision floating-point data type. */
014  kDouble(0x02, "double"),
015  /** String data type. */
016  kString(0x04, "string"),
017  /** Raw data type. */
018  kRaw(0x08, "raw"),
019  /** Boolean array data type. */
020  kBooleanArray(0x10, "boolean[]"),
021  /** Double precision floating-point array data type. */
022  kDoubleArray(0x20, "double[]"),
023  /** String array data type. */
024  kStringArray(0x40, "string[]"),
025  /** Integer data type. */
026  kInteger(0x100, "int"),
027  /** Single precision floating-point data type. */
028  kFloat(0x200, "float"),
029  /** Integer array data type. */
030  kIntegerArray(0x400, "int[]"),
031  /** Single precision floating-point array data type. */
032  kFloatArray(0x800, "float[]");
033
034  private final int m_value;
035  private final String m_valueStr;
036
037  NetworkTableType(int value, String valueStr) {
038    m_value = value;
039    m_valueStr = valueStr;
040  }
041
042  /**
043   * Returns the NetworkTable type value.
044   *
045   * @return The NetworkTable type value.
046   */
047  public int getValue() {
048    return m_value;
049  }
050
051  /**
052   * Returns the NetworkTable type value as as string.
053   *
054   * @return The NetworkTable type value as a string.
055   */
056  public String getValueStr() {
057    return m_valueStr;
058  }
059
060  /**
061   * Convert from the numerical representation of type to an enum type.
062   *
063   * @param value The numerical representation of kind
064   * @return The kind
065   */
066  public static NetworkTableType getFromInt(int value) {
067    switch (value) {
068      case 0x01:
069        return kBoolean;
070      case 0x02:
071        return kDouble;
072      case 0x04:
073        return kString;
074      case 0x08:
075        return kRaw;
076      case 0x10:
077        return kBooleanArray;
078      case 0x20:
079        return kDoubleArray;
080      case 0x40:
081        return kStringArray;
082      case 0x100:
083        return kInteger;
084      case 0x200:
085        return kFloat;
086      case 0x400:
087        return kIntegerArray;
088      case 0x800:
089        return kFloatArray;
090      default:
091        return kUnassigned;
092    }
093  }
094
095  /**
096   * Convert from a type string to an enum type.
097   *
098   * @param typeString type string
099   * @return The kind
100   */
101  public static NetworkTableType getFromString(String typeString) {
102    switch (typeString) {
103      case "boolean":
104        return kBoolean;
105      case "double":
106        return kDouble;
107      case "float":
108        return kFloat;
109      case "int":
110        return kInteger;
111      case "string":
112      case "json":
113        return kString;
114      case "boolean[]":
115        return kBooleanArray;
116      case "double[]":
117        return kDoubleArray;
118      case "float[]":
119        return kFloatArray;
120      case "int[]":
121        return kIntegerArray;
122      case "string[]":
123        return kStringArray;
124      case "":
125        return kUnassigned;
126      default:
127        return kRaw;
128    }
129  }
130
131  /**
132   * Gets string from generic data value.
133   *
134   * @param data the data to check
135   * @return type string of the data, or empty string if no match
136   */
137  public static String getStringFromObject(Object data) {
138    if (data instanceof Boolean) {
139      return "boolean";
140    } else if (data instanceof Float) {
141      return "float";
142    } else if (data instanceof Long) {
143      // Checking Long because NT supports 64-bit integers
144      return "int";
145    } else if (data instanceof Double || data instanceof Number) {
146      // If typeof Number class, return "double" as the type. Functions as a "catch-all".
147      return "double";
148    } else if (data instanceof String) {
149      return "string";
150    } else if (data instanceof boolean[] || data instanceof Boolean[]) {
151      return "boolean[]";
152    } else if (data instanceof float[] || data instanceof Float[]) {
153      return "float[]";
154    } else if (data instanceof long[] || data instanceof Long[]) {
155      return "int[]";
156    } else if (data instanceof double[] || data instanceof Double[] || data instanceof Number[]) {
157      // If typeof Number class, return "double[]" as the type. Functions as a "catch-all".
158      return "double[]";
159    } else if (data instanceof String[]) {
160      return "string[]";
161    } else if (data instanceof byte[] || data instanceof Byte[]) {
162      return "raw";
163    } else {
164      return "";
165    }
166  }
167}