diff options
| author | Omar Rizwan <omar@omar.website> | 2026-02-04 21:37:53 +0000 |
|---|---|---|
| committer | Omar Rizwan <omar@omar.website> | 2026-02-04 21:37:53 +0000 |
| commit | e9fc37bc6a091fbc712ae82465d8ecdddde05ea9 (patch) | |
| tree | e1e26f5098eb5c985422631ccbca6a979585d009 /lib/python.tcl | |
| parent | WIP: Add Uvx def. Need to implement custom argtype for Image next (diff) | |
| download | folk-e9fc37bc6a091fbc712ae82465d8ecdddde05ea9.tar.gz folk-e9fc37bc6a091fbc712ae82465d8ecdddde05ea9.zip | |
lib/python: WIP: Need to send parts separately for Image
Diffstat (limited to 'lib/python.tcl')
| -rw-r--r-- | lib/python.tcl | 69 |
1 files changed, 58 insertions, 11 deletions
diff --git a/lib/python.tcl b/lib/python.tcl index 426a3e93..0ea52d29 100644 --- a/lib/python.tcl +++ b/lib/python.tcl @@ -39,6 +39,20 @@ $cc proc zmqConnect {void* socket char* endpoint} int { return zmq_connect(socket, endpoint); } +$cc proc zmqSend {void* socket char* data int flags} int { + return zmq_send(socket, data, strlen(data), flags); +} + +$cc proc zmqSendMore {void* socket char* data} int { + return zmq_send(socket, data, strlen(data), ZMQ_SNDMORE); +} + +$cc proc zmqSendBytes {void* socket Jim_Obj* data int flags} int { + int len; + const char *bytes = Jim_GetString(data, &len); + return zmq_send(socket, bytes, len, flags); +} + $cc proc zmqSendMulti {void* socket Jim_Obj* parts} void { int len = Jim_ListLength(interp, parts); for (int i = 0; i < len; i++) { @@ -81,10 +95,12 @@ set zmq [$cc compile] class Uvx [list \ UVX $UVX zmq $zmq \ socket "" endpoint "" \ - functions {}] + functions {} \ + argtypes {}] Uvx method constructor args { set functions [dict create] + set argtypes [dict create] set endpoint "ipc:///tmp/uvx-[clock milliseconds]-[expr {int(rand() * 100000)}].ipc" set socket [$zmq zmqSocket REQ] @@ -143,26 +159,53 @@ while True: } Uvx method unknown {funcName args} { + # Send function name first + if {[llength $args] > 0} { + $zmq zmqSendMore $socket $funcName + } else { + $zmq zmqSend $socket $funcName 0 + } + # Check if this function has registered types if {[dict exists $functions $funcName]} { set funcInfo [dict get $functions $funcName] set argTypes [dict get $funcInfo argTypes] - # Serialize arguments according to their JSON schemas - set serializedArgs {} + # Send each argument according to its type + set numArgs [llength $args] + set i 0 foreach schema $argTypes arg $args { - # Use schema as json::encode schema - lappend serializedArgs [json::encode $arg $schema] + incr i + set isLast [expr {$i == $numArgs}] + set flags [expr {$isLast ? 0 : 0x01}] + + # Check if this is a custom argtype + if {[dict exists $argtypes $schema]} { + set serializerCode [dict get $argtypes $schema] + # Evaluate the serializer code with $arg, $socket, $flags, and $zmq in scope + set zmq $zmq + set socket $socket + set arg $arg + set flags $flags + eval $serializerCode + } else { + # Use JSON encoding + set encoded [json::encode $arg $schema] + $zmq zmqSendBytes $socket $encoded $flags + } } - - set parts [list $funcName {*}$serializedArgs] } else { - # No type info, send args as-is - set parts [list $funcName {*}$args] + # No type info, send args as strings + set numArgs [llength $args] + set i 0 + foreach arg $args { + incr i + set isLast [expr {$i == $numArgs}] + set flags [expr {$isLast ? 0 : 0x01}] + $zmq zmqSend $socket $arg $flags + } } - $zmq zmqSendMulti $socket $parts - set response [$zmq zmqRecvMulti $socket] lassign $response status value @@ -173,6 +216,10 @@ Uvx method run {code} { return [$self unknown "eval" $code] } +Uvx method argtype {typeName serializer} { + dict set argtypes $typeName $serializer +} + Uvx method def {funcName argSpec body} { # Parse argument specification: {Type1 name1 Type2 name2 ...} set argNames {} |
