[Xotcl] Scripted Value Constraints

Stefan Sobernig stefan.sobernig at wu.ac.at
Fri Jan 13 09:40:08 CET 2023


Hi Maksym!

To define your custom and named "value-type checker" (uuid), either for 
object parameters, method parameters, or both, you have to define a 
corresponding method on two built-in objects:

... on ::nx::ObjectParameterSlot for the scope of object parameters;
... on ::nx::methodParameterSlot for the scope of method parameters;

Watch:

::nx::ObjectParameterSlot method type=uuid {name value} {
   set pattern 
{^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$}
   if {![regexp $pattern $value]} {
     error "Value '$value' of parameter $name is not UUID"
   }
   return $value
}

nx::Class create myClass {
   :property -accessor public {user:uuid,required}
}

set obj [myClass new -user 5a40e63a-9317-11ed-a1eb-0242ac120002]; # ok
puts [$obj user get]

myClass new -user nope-9317-11ed-a1eb-0242ac120002; # not ok

Some more remarks:

- the method names must carry the prefix "type=";
- the checker methods must return the validated value (or, a derived one);
- To create a method-parameter checker, you have to define an object 
method "type=uuid" on ::nx::methodParameterSlot, like:

::nx::methodParameterSlot object method type=uuid {name value} {
   set pattern 
{^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$}
   if {![regexp $pattern $value]} {
     error "Value '$value' of parameter $name is not UUID"
   }
   return $value
}

(Note the difference: "object" modifier!)

... to avoid a duplicated and use a shared definition, you may create an 
alias:

set m [::nx::ObjectParameterSlot method type=uuid {name value} {
     # stripped for clarity
}]

::nx::methodParameterSlot object alias type=uuid $m

Then, you can use:

myClass public method foo {user:uuid} {
   puts "Accepted: $user"
}

$obj foo 5a40e63a-9317-11ed-a1eb-0242ac120002; # ok
$obj foo nope-9317-11ed-a1eb-0242ac120002; # not ok

> This part is kinda blurry for me, what does it means define a name?

"Name" refers to a custom, self-chosen name "uuid", that can be then 
used to specify value constraints on object and/ or method parameters.

If you have ideas, suggestions for improvement regarding documentation, 
we will be happy to consider them.

HTH, Stefan






More information about the Xotcl mailing list