Browse Source

feat(expressions): add to_value method for type conversion

Add a virtual to_value method to Element that converts elements to GLib
Value types. Supports all primitive types (bool, char, int, long, float,
double, string) as well as Object, with a fallback that attempts Object
conversion for unknown types.
Billy Barrow 6 days ago
parent
commit
956b152ae9
1 changed files with 36 additions and 0 deletions
  1. 36 0
      src/lib/Element.vala

+ 36 - 0
src/lib/Element.vala

@@ -56,6 +56,42 @@ namespace Invercargill {
             assert_not_reached();
         }
 
+        public virtual Value to_value(Type requested_type) throws Error {
+            Value result = Value(requested_type);
+            
+            if(requested_type == typeof(bool)) {
+                result.set_boolean(@as<bool>());
+            } else if(requested_type == typeof(char)) {
+                result.set_schar((int8)@as<char>());
+            } else if(requested_type == typeof(uchar)) {
+                result.set_uchar(@as<uchar>());
+            } else if(requested_type == typeof(int)) {
+                result.set_int(@as<int>());
+            } else if(requested_type == typeof(uint)) {
+                result.set_uint(@as<uint>());
+            } else if(requested_type == typeof(long)) {
+                result.set_long(@as<long>());
+            } else if(requested_type == typeof(ulong)) {
+                result.set_ulong(@as<ulong>());
+            } else if(requested_type == typeof(int64)) {
+                result.set_int64(@as<int64?>());
+            } else if(requested_type == typeof(uint64)) {
+                result.set_uint64(@as<uint64?>());
+            } else if(requested_type == typeof(float)) {
+                result.set_float(@as<float?>());
+            } else if(requested_type == typeof(double)) {
+                result.set_double(@as<double?>());
+            } else if(requested_type == typeof(string)) {
+                result.set_string(@as<string>());
+            } else if(requested_type == typeof(Object)) {
+                result.set_object(@as<Object>());
+            } else {
+                // Fallback for any other type - try to get as Object
+                result.set_object(@as<Object>());
+            }
+            
+            return result;
+        }
 
         public virtual string to_string() {
             return @"Element[$(type_name())]";