From c61bc8addafac8f0fcb00292c55400064de1e7bf Mon Sep 17 00:00:00 2001
From: Naveed Jooma <naveed@viam.com>
Date: Tue, 29 Oct 2024 12:34:31 -0400
Subject: [PATCH] Add get properties

---
 lib/src/services/vision.dart             | 19 +++++++++++++++++++
 test/unit_test/services/vision_test.dart |  7 +++++++
 2 files changed, 26 insertions(+)

diff --git a/lib/src/services/vision.dart b/lib/src/services/vision.dart
index 35bce85abf9..099bc086e0a 100644
--- a/lib/src/services/vision.dart
+++ b/lib/src/services/vision.dart
@@ -8,6 +8,10 @@ import '../resource/base.dart';
 import '../robot/client.dart';
 import '../utils.dart';
 
+/// {@category Viam SDK}
+/// The vision service's supported features and settings
+typedef VisionProperties = GetPropertiesResponse;
+
 /// {@category Services}
 class VisionClient extends Resource implements ResourceRPCClient {
   static const Subtype subtype = Subtype(resourceNamespaceRDK, resourceTypeService, 'vision');
@@ -100,6 +104,21 @@ class VisionClient extends Resource implements ResourceRPCClient {
     return response.objects;
   }
 
+  /// Get info about what vision methods the vision service provides.
+  /// Currently returns boolean values that state whether the service implements the
+  /// classification, detection, and/or 3D object segmentation methods.
+  ///
+  /// ```
+  /// // Example:
+  /// var properties = await myVisionService.properties();
+  /// properties.detections_supported       // returns true
+  /// properties.classifications_supported  // returns false
+  /// ```
+  Future<VisionProperties> properties({Map<String, dynamic>? extra}) async {
+    final request = GetPropertiesRequest(name: name, extra: extra?.toStruct());
+    return await client.getProperties(request);
+  }
+
   @override
   Future<Map<String, dynamic>> doCommand(Map<String, dynamic> command) async {
     final request = DoCommandRequest()
diff --git a/test/unit_test/services/vision_test.dart b/test/unit_test/services/vision_test.dart
index da8fb451764..f7288da064c 100644
--- a/test/unit_test/services/vision_test.dart
+++ b/test/unit_test/services/vision_test.dart
@@ -59,6 +59,13 @@ void main() {
       expect(response, equals(expected));
     });
 
+    test('properties', () async {
+      final expected = GetPropertiesResponse(classificationsSupported: true);
+      when(serviceClient.getProperties(any)).thenAnswer((_) => MockResponseFuture.value(expected));
+      final response = await client.properties();
+      expect(response, equals(expected));
+    });
+
     test('getObjectPointClouds', () async {
       final expected = [
         PointCloudObject(