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  kUnassigned(0, ""),
010  kBoolean(0x01, "boolean"),
011  kDouble(0x02, "double"),
012  kString(0x04, "string"),
013  kRaw(0x08, "raw"),
014  kBooleanArray(0x10, "boolean[]"),
015  kDoubleArray(0x20, "double[]"),
016  kStringArray(0x40, "string[]"),
017  kInteger(0x100, "int"),
018  kFloat(0x200, "float"),
019  kIntegerArray(0x400, "int[]"),
020  kFloatArray(0x800, "float[]");
021
022  private final int m_value;
023  private final String m_valueStr;
024
025  NetworkTableType(int value, String valueStr) {
026    m_value = value;
027    m_valueStr = valueStr;
028  }
029
030  public int getValue() {
031    return m_value;
032  }
033
034  public String getValueStr() {
035    return m_valueStr;
036  }
037
038  /**
039   * Convert from the numerical representation of type to an enum type.
040   *
041   * @param value The numerical representation of kind
042   * @return The kind
043   */
044  public static NetworkTableType getFromInt(int value) {
045    switch (value) {
046      case 0x01:
047        return kBoolean;
048      case 0x02:
049        return kDouble;
050      case 0x04:
051        return kString;
052      case 0x08:
053        return kRaw;
054      case 0x10:
055        return kBooleanArray;
056      case 0x20:
057        return kDoubleArray;
058      case 0x40:
059        return kStringArray;
060      case 0x100:
061        return kInteger;
062      case 0x200:
063        return kFloat;
064      case 0x400:
065        return kIntegerArray;
066      case 0x800:
067        return kFloatArray;
068      default:
069        return kUnassigned;
070    }
071  }
072
073  /**
074   * Convert from a type string to an enum type.
075   *
076   * @param typeString type string
077   * @return The kind
078   */
079  public static NetworkTableType getFromString(String typeString) {
080    switch (typeString) {
081      case "boolean":
082        return kBoolean;
083      case "double":
084        return kDouble;
085      case "float":
086        return kFloat;
087      case "int":
088        return kInteger;
089      case "string":
090      case "json":
091        return kString;
092      case "boolean[]":
093        return kBooleanArray;
094      case "double[]":
095        return kDoubleArray;
096      case "float[]":
097        return kFloatArray;
098      case "int[]":
099        return kIntegerArray;
100      case "string[]":
101        return kStringArray;
102      case "":
103        return kUnassigned;
104      default:
105        return kRaw;
106    }
107  }
108
109  /**
110   * Gets string from generic data value.
111   *
112   * @param data the data to check
113   * @return type string of the data, or empty string if no match
114   */
115  public static String getStringFromObject(Object data) {
116    if (data instanceof Boolean) {
117      return "boolean";
118    } else if (data instanceof Float) {
119      return "float";
120    } else if (data instanceof Long) {
121      // Checking Long because NT supports 64-bit integers
122      return "int";
123    } else if (data instanceof Double || data instanceof Number) {
124      // If typeof Number class, return "double" as the type. Functions as a "catch-all".
125      return "double";
126    } else if (data instanceof String) {
127      return "string";
128    } else if (data instanceof boolean[] || data instanceof Boolean[]) {
129      return "boolean[]";
130    } else if (data instanceof float[] || data instanceof Float[]) {
131      return "float[]";
132    } else if (data instanceof long[] || data instanceof Long[]) {
133      return "int[]";
134    } else if (data instanceof double[] || data instanceof Double[] || data instanceof Number[]) {
135      // If typeof Number class, return "double[]" as the type. Functions as a "catch-all".
136      return "double[]";
137    } else if (data instanceof String[]) {
138      return "string[]";
139    } else if (data instanceof byte[] || data instanceof Byte[]) {
140      return "raw";
141    } else {
142      return "";
143    }
144  }
145}