fromNativeValue static method

DBusValue fromNativeValue(
  1. dynamic value, {
  2. DBusSignature? expectedSignature,
})

Implementation

static DBusValue fromNativeValue(dynamic value,
    {DBusSignature? expectedSignature}) {
  if (expectedSignature != null) {
    if (expectedSignature.value.startsWith('a') && value is List) {
      final childSignature =
          DBusSignature(expectedSignature.value.substring(1));
      return DBusArray(
        childSignature,
        value
            .map((v) => fromNativeValue(v, expectedSignature: childSignature))
            .toList(),
      );
    }
    if (expectedSignature.value == '(oa{sv})' && value is List) {
      if (value.length != 2) {
        throw Exception('Struct (oa{sv}) requires 2 elements');
      }
      return DBusStruct([
        fromNativeValue(value[0], expectedSignature: DBusSignature('o')),
        fromNativeValue(value[1], expectedSignature: DBusSignature('a{sv}')),
      ]);
    }

    if (expectedSignature.value == 'a{sv}' && value is Map) {
      return DBusDict(
        DBusSignature('s'),
        DBusSignature('v'),
        value.map((k, v) => MapEntry(
              DBusString(k.toString()),
              fromNativeValue(v, expectedSignature: DBusSignature('v')),
            )),
      );
    }

    if (expectedSignature.value == 'v') {
      if (value is String) {
        return DBusVariant(DBusString(value));
      } else if (value is int) {
        if (value.bitLength <= 16) return DBusVariant(DBusInt16(value));
        if (value.bitLength <= 32) return DBusVariant(DBusInt32(value));
        return DBusVariant(DBusInt64(value));
      } else if (value is bool) {
        return DBusVariant(DBusBoolean(value));
      } else if (value is double) {
        return DBusVariant(DBusDouble(value));
      } else if (value is List) {
        if (value.isEmpty) return DBusVariant(DBusArray.string([]));
        final childSignature = fromNativeValue(value.first).signature;
        return DBusVariant(DBusArray(
          childSignature,
          value.map((v) => fromNativeValue(v)).toList(),
        ));
      } else if (value is Map) {
        return DBusVariant(DBusDict(
          DBusSignature('s'),
          DBusSignature('v'),
          value.map((k, v) => MapEntry(
                DBusString(k.toString()),
                fromNativeValue(v, expectedSignature: DBusSignature('v')),
              )),
        ));
      } else {
        throw Exception(
            'Unsupported variant value type: ${value.runtimeType}');
      }
    }

    if (expectedSignature.value == 'o' && value is String) {
      return DBusObjectPath(value);
    }
  }

  if (value is String) {
    return DBusString(value);
  } else if (value is int) {
    if (value.bitLength <= 16) return DBusInt16(value);
    if (value.bitLength <= 32) return DBusInt32(value);
    return DBusInt64(value);
  } else if (value is bool) {
    return DBusBoolean(value);
  } else if (value is double) {
    return DBusDouble(value);
  } else if (value is List) {
    if (value.isEmpty) return DBusArray.string([]);
    final firstElement = fromNativeValue(value.first);
    return DBusArray(
      firstElement.signature,
      value.map((v) => fromNativeValue(v)).toList(),
    );
  } else if (value is Map) {
    return DBusDict(
      DBusSignature('s'),
      DBusSignature('s'),
      value.map((k, v) => MapEntry(
            DBusString(k.toString()),
            DBusString(v.toString()),
          )),
    );
  } else {
    throw Exception('Unsupported native value type: ${value.runtimeType}');
  }
}