Merge remote-tracking branch 'origin/pycurl' into planetlab-4_0-branch
[plcapi.git] / PLC / Parameter.py
index 5f573f8..474ad78 100644 (file)
@@ -4,9 +4,12 @@
 # Mark Huang <mlhuang@cs.princeton.edu>
 # Copyright (C) 2006 The Trustees of Princeton University
 #
-# $Id: Parameter.py,v 1.2 2006/09/08 19:45:04 mlhuang Exp $
+# $Id: Parameter.py 5574 2007-10-25 20:33:17Z thierry $
 #
 
+from types import *
+from PLC.Faults import *
+
 class Parameter:
     """
     Typed value wrapper. Use in accepts and returns to document method
@@ -16,9 +19,11 @@ class Parameter:
 
     def __init__(self, type, doc = "",
                  min = None, max = None,
-                 optional = True, default = None,
-                 ro = False):
-        # Basic type of the parameter. May be a builtin type or Mixed.
+                 optional = None,
+                 ro = False,
+                 nullok = False):
+        # Basic type of the parameter. Must be a builtin type
+        # that can be marshalled by XML-RPC.
         self.type = type
 
         # Documentation string for the parameter
@@ -30,14 +35,19 @@ class Parameter:
         self.min = min
         self.max = max
 
-        # Whether the sub-parameter is optional or not. If optional,
-        # the default for the sub-parameter if not specified.
+        # Whether the sub-parameter is optional or not. If None,
+        # unknown whether it is optional.
         self.optional = optional
-        self.default = default
 
         # Whether the DB field is read-only.
         self.ro = ro
 
+        # Whether the DB field can be NULL.
+        self.nullok = nullok
+
+    def type(self):
+        return self.type
+
     def __repr__(self):
         return repr(self.type)
 
@@ -49,3 +59,47 @@ class Mixed(tuple):
 
     def __new__(cls, *types):
         return tuple.__new__(cls, types)
+
+
+def python_type(arg):
+    """
+    Returns the Python type of the specified argument, which may be a
+    Python type, a typed value, or a Parameter.
+    """
+
+    if isinstance(arg, Parameter):
+        arg = arg.type
+
+    if isinstance(arg, type):
+        return arg
+    else:
+        return type(arg)
+
+def xmlrpc_type(arg):
+    """
+    Returns the XML-RPC type of the specified argument, which may be a
+    Python type, a typed value, or a Parameter.
+    """
+
+    arg_type = python_type(arg)
+
+    if arg_type == NoneType:
+        return "nil"
+    elif arg_type == IntType or arg_type == LongType:
+        return "int"
+    elif arg_type == bool:
+        return "boolean"
+    elif arg_type == FloatType:
+        return "double"
+    elif arg_type in StringTypes:
+        return "string"
+    elif arg_type == ListType or arg_type == TupleType:
+        return "array"
+    elif arg_type == DictType:
+        return "struct"
+    elif arg_type == Mixed:
+        # Not really an XML-RPC type but return "mixed" for
+        # documentation purposes.
+        return "mixed"
+    else:
+        raise PLCAPIError, "XML-RPC cannot marshal %s objects" % arg_type