Safe Haskell | None |
---|
TemplateHaskell helper for Ganeti Haskell code.
As TemplateHaskell require that splices be defined in a separate module, we combine all the TemplateHaskell functionality that HTools needs in this module (except the one for unittests).
- class DictObject a where
- toDict :: a -> [(String, JSValue)]
- data OptionalType
- data Field = Field {
- fieldName :: String
- fieldType :: Q Type
- fieldRead :: Maybe (Q Exp)
- fieldShow :: Maybe (Q Exp)
- fieldExtraKeys :: [String]
- fieldDefault :: Maybe (Q Exp)
- fieldConstr :: Maybe String
- fieldIsOptional :: OptionalType
- fieldDoc :: String
- simpleField :: String -> Q Type -> Field
- withDoc :: String -> Field -> Field
- renameField :: String -> Field -> Field
- defaultField :: Q Exp -> Field -> Field
- optionalField :: Field -> Field
- optionalNullSerField :: Field -> Field
- customField :: Name -> Name -> [String] -> Field -> Field
- fieldRecordName :: Field -> String
- fieldVariable :: Field -> String
- actualFieldType :: Field -> Q Type
- checkNonOptDef :: Monad m => Field -> m ()
- loadFn :: Field -> Q Exp -> Q Exp -> Q Exp
- timeStampFields :: [Field]
- serialFields :: [Field]
- uuidFields :: [Field]
- type TagSet = Set String
- tagsFields :: [Field]
- type SimpleField = (String, Q Type)
- type SimpleConstructor = (String, [SimpleField])
- type SimpleObject = [SimpleConstructor]
- type OpCodeConstructor = (String, Q Type, String, [Field], String)
- type LuxiConstructor = (String, [Field])
- ensureLower :: String -> String
- ensureUpper :: String -> String
- varNameE :: String -> Q Exp
- showJSONE :: Q Exp
- makeObjE :: Q Exp
- fromObjE :: Q Exp
- toRawName :: String -> Name
- fromRawName :: String -> Name
- reprE :: Either String Name -> Q Exp
- appFn :: Exp -> Exp -> Exp
- buildConsField :: Q Type -> StrictTypeQ
- buildSimpleCons :: Name -> SimpleObject -> Q Dec
- genSaveSimpleObj :: Name -> String -> SimpleObject -> (SimpleConstructor -> Q Clause) -> Q (Dec, Dec)
- strADTDecl :: Name -> [String] -> Dec
- genToRaw :: Name -> Name -> Name -> [(String, Either String Name)] -> Q [Dec]
- genFromRaw :: Name -> Name -> Name -> [(String, Either String Name)] -> Q [Dec]
- declareADT :: (a -> Either String Name) -> Name -> String -> [(String, a)] -> Q [Dec]
- declareLADT :: Name -> String -> [(String, String)] -> Q [Dec]
- declareILADT :: String -> [(String, Int)] -> Q [Dec]
- declareIADT :: String -> [(String, Name)] -> Q [Dec]
- declareSADT :: String -> [(String, Name)] -> Q [Dec]
- genShowJSON :: String -> Q Dec
- genReadJSON :: String -> Q Dec
- makeJSONInstance :: Name -> Q [Dec]
- deCamelCase :: String -> String
- camelCase :: String -> String
- constructorName :: Con -> Q Name
- reifyConsNames :: Name -> Q [String]
- genConstrToStr :: (String -> String) -> Name -> String -> Q [Dec]
- genOpID :: Name -> String -> Q [Dec]
- genAllConstr :: (String -> String) -> Name -> String -> Q [Dec]
- genAllOpIDs :: Name -> String -> Q [Dec]
- type OpParam = (String, Q Type, Q Exp)
- class PyValue a where
- showValue :: a -> String
- data PyValueEx = forall a . PyValue a => PyValueEx a
- type OpCodeDescriptor = (String, String, String, [String], [String], [Maybe PyValueEx], [String], String)
- pyBaseName :: String -> String
- pyTypeName :: Show a => a -> String
- pyType :: Type -> Q String
- pyCall :: Type -> Type -> Q String
- pyOptionalType :: Bool -> Type -> Q String
- maybeApp :: Maybe (Q Exp) -> Q Type -> Q Exp
- genPyType :: OptionalType -> Q Type -> Q ExpQ
- genPyTypes :: [Field] -> Q ExpQ
- genPyDefaults :: [Field] -> ExpQ
- pyClass :: OpCodeConstructor -> ExpQ
- pyClasses :: [OpCodeConstructor] -> Q [Dec]
- opcodeConsToLuxiCons :: (a, b, c, d, e) -> (a, d)
- genOpCode :: String -> [OpCodeConstructor] -> Q [Dec]
- genOpConsFields :: OpCodeConstructor -> Clause
- genAllOpFields :: String -> [OpCodeConstructor] -> (Dec, Dec)
- saveConstructor :: LuxiConstructor -> Q Clause
- genSaveOpCode :: Name -> String -> String -> [LuxiConstructor] -> (LuxiConstructor -> Q Clause) -> Bool -> Q [Dec]
- loadConstructor :: OpCodeConstructor -> Q Exp
- genLoadOpCode :: [OpCodeConstructor] -> Q (Dec, Dec)
- genStrOfOp :: Name -> String -> Q [Dec]
- genStrOfKey :: Name -> String -> Q [Dec]
- genLuxiOp :: String -> [LuxiConstructor] -> Q [Dec]
- saveLuxiConstructor :: LuxiConstructor -> Q Clause
- fieldTypeInfo :: String -> Field -> Q (Name, Strict, Type)
- buildObject :: String -> String -> [Field] -> Q [Dec]
- buildObjectSerialisation :: String -> [Field] -> Q [Dec]
- toDictName :: String -> Name
- genSaveObject :: (Name -> Field -> Q Exp) -> String -> [Field] -> Q [Dec]
- saveObjectField :: Name -> Field -> Q Exp
- objectShowJSON :: String -> Q Dec
- genLoadObject :: (Field -> Q (Name, Stmt)) -> String -> [Field] -> Q (Dec, Dec)
- loadObjectField :: Field -> Q (Name, Stmt)
- objectReadJSON :: String -> Q Dec
- paramTypeNames :: String -> (String, String)
- paramFieldTypeInfo :: String -> Field -> Q (Name, Strict, Type)
- buildParam :: String -> String -> [Field] -> Q [Dec]
- buildParamAllFields :: String -> [Field] -> [Dec]
- buildDictObjectInst :: Name -> String -> [Dec]
- buildPParamSerialisation :: String -> [Field] -> Q [Dec]
- savePParamField :: Name -> Field -> Q Exp
- loadPParamField :: Field -> Q (Name, Stmt)
- buildFromMaybe :: String -> Q Dec
- fillParam :: String -> String -> [Field] -> Q [Dec]
- excErrMsg :: (String, Q Type)
- genException :: String -> SimpleObject -> Q [Dec]
- saveExcCons :: String -> [SimpleField] -> Q Clause
- loadExcConstructor :: Name -> String -> [SimpleField] -> Q Exp
- genLoadExc :: Name -> String -> SimpleObject -> Q (Dec, Dec)
Exported types
class DictObject a whereSource
Class of objects that can be converted to JSObject
lists-format.
data OptionalType Source
Eq OptionalType | |
Show OptionalType |
Serialised field data type.
Field | |
|
simpleField :: String -> Q Type -> FieldSource
Generates a simple field.
renameField :: String -> Field -> FieldSource
Sets the renamed constructor field.
defaultField :: Q Exp -> Field -> FieldSource
Sets the default value on a field (makes it optional with a default value).
optionalField :: Field -> FieldSource
Marks a field optional (turning its base type into a Maybe).
optionalNullSerField :: Field -> FieldSource
Marks a field optional (turning its base type into a Maybe), but
with Nothing
serialised explicitly as null.
:: Name | The name of the read function |
-> Name | The name of the show function |
-> [String] | The name of extra field keys |
-> Field | The original field |
-> Field | Updated field |
Sets custom functions on a field.
fieldRecordName :: Field -> StringSource
fieldVariable :: Field -> StringSource
actualFieldType :: Field -> Q TypeSource
checkNonOptDef :: Monad m => Field -> m ()Source
Common field declarations
timeStampFields :: [Field]Source
Timestamp fields description.
serialFields :: [Field]Source
Serial number fields description.
uuidFields :: [Field]Source
UUID fields description.
tagsFields :: [Field]Source
Tag field description.
Internal types
type SimpleField = (String, Q Type)Source
type SimpleConstructor = (String, [SimpleField])Source
type SimpleObject = [SimpleConstructor]Source
type OpCodeConstructor = (String, Q Type, String, [Field], String)Source
type LuxiConstructor = (String, [Field])Source
Helper functions
ensureLower :: String -> StringSource
ensureUpper :: String -> StringSource
fromRawName :: String -> NameSource
buildConsField :: Q Type -> StrictTypeQSource
buildSimpleCons :: Name -> SimpleObject -> Q DecSource
genSaveSimpleObj :: Name -> String -> SimpleObject -> (SimpleConstructor -> Q Clause) -> Q (Dec, Dec)Source
Template code for simple raw type-equivalent ADTs
strADTDecl :: Name -> [String] -> DecSource
genFromRaw :: Name -> Name -> Name -> [(String, Either String Name)] -> Q [Dec]Source
declareADT :: (a -> Either String Name) -> Name -> String -> [(String, a)] -> Q [Dec]Source
declareLADT :: Name -> String -> [(String, String)] -> Q [Dec]Source
declareILADT :: String -> [(String, Int)] -> Q [Dec]Source
declareIADT :: String -> [(String, Name)] -> Q [Dec]Source
declareSADT :: String -> [(String, Name)] -> Q [Dec]Source
genShowJSON :: String -> Q DecSource
genReadJSON :: String -> Q DecSource
makeJSONInstance :: Name -> Q [Dec]Source
Generates a JSON instance for a given type.
This assumes that the nameToRaw and nameFromRaw functions
have been defined as by the declareSADT
function.
Template code for opcodes
deCamelCase :: String -> StringSource
Transforms a CamelCase string into an_underscore_based_one.
constructorName :: Con -> Q NameSource
reifyConsNames :: Name -> Q [String]Source
genConstrToStr :: (String -> String) -> Name -> String -> Q [Dec]Source
genAllConstr :: (String -> String) -> Name -> String -> Q [Dec]Source
Builds a list with all defined constructor names for a type.
vstr :: String vstr = [...]
Where the actual values of the string are the constructor names
mapped via trans_fun
.
genAllOpIDs :: Name -> String -> Q [Dec]Source
Generates a list of all defined opcode IDs.
Python code generation
Converts Haskell values into Python values
This is necessary for the default values of opcode parameters and return values. For example, if a default value or return type is a Data.Map, then it must be shown as a Python dictioanry.
PyValue Bool | |
PyValue Char | |
PyValue Double | |
PyValue Int | |
PyValue Integer | |
PyValue String | |
PyValue JSValue | |
PyValue PyValueEx | |
PyValue Protocol | This instance is used by the Haskell to Python constants |
PyValue PythonNone | |
PyValue PythonChar | |
PyValue DiskTemplate | |
PyValue VerifyOptionalChecks | |
PyValue CVErrorCode | |
PyValue Hypervisor | |
PyValue ExportMode | |
PyValue VType | |
PyValue DiskIndex | |
PyValue INicParams | |
PyValue RecreateDisksInfo | |
PyValue IDiskParams | |
PyValue a => PyValue [a] | |
PyValue a => PyValue (JSObject a) | |
PyValue a => PyValue (ListSet a) | |
PyValue a => PyValue (FrozenSet a) | Converts a Haskell This instance was supposed to be for |
PyValue a => PyValue (NonEmpty a) | |
PyValue a => PyValue (NonNegative a) | |
PyValue a => PyValue (SetParamsMods a) | |
(PyValue a, PyValue b) => PyValue (a, b) | |
(PyValue k, PyValue a) => PyValue (Map k a) | |
(PyValue a, PyValue b, PyValue c) => PyValue (a, b, c) |
Encapsulates Python default values
type OpCodeDescriptor = (String, String, String, [String], [String], [Maybe PyValueEx], [String], String)Source
Transfers opcode data between the opcode description (through
genOpCode
) and the Python code generation functions.
pyBaseName :: String -> StringSource
pyTypeName :: Show a => a -> StringSource
pyOptionalType :: Bool -> Type -> Q StringSource
genPyType :: OptionalType -> Q Type -> Q ExpQSource
genPyTypes :: [Field] -> Q ExpQSource
genPyDefaults :: [Field] -> ExpQSource
pyClass :: OpCodeConstructor -> ExpQSource
pyClasses :: [OpCodeConstructor] -> Q [Dec]Source
opcodeConsToLuxiCons :: (a, b, c, d, e) -> (a, d)Source
:: String | Type name to use |
-> [OpCodeConstructor] | Constructor name and parameters |
-> Q [Dec] |
Generates the OpCode data type.
This takes an opcode logical definition, and builds both the datatype and the JSON serialisation out of it. We can't use a generic serialisation since we need to be compatible with Ganeti's own, so we have a few quirks to work around.
genOpConsFields :: OpCodeConstructor -> ClauseSource
genAllOpFields :: String -> [OpCodeConstructor] -> (Dec, Dec)Source
saveConstructor :: LuxiConstructor -> Q ClauseSource
genSaveOpCode :: Name -> String -> String -> [LuxiConstructor] -> (LuxiConstructor -> Q Clause) -> Bool -> Q [Dec]Source
loadConstructor :: OpCodeConstructor -> Q ExpSource
genLoadOpCode :: [OpCodeConstructor] -> Q (Dec, Dec)Source
Template code for luxi
genStrOfOp :: Name -> String -> Q [Dec]Source
Constructor-to-string for LuxiOp.
genStrOfKey :: Name -> String -> Q [Dec]Source
Constructor-to-string for MsgKeys.
genLuxiOp :: String -> [LuxiConstructor] -> Q [Dec]Source
Generates the LuxiOp data type.
This takes a Luxi operation definition and builds both the datatype and the function transforming the arguments to JSON. We can't use anything less generic, because the way different operations are serialized differs on both parameter- and top-level.
There are two things to be defined for each parameter:
- name
- type
saveLuxiConstructor :: LuxiConstructor -> Q ClauseSource
Objects functionality
fieldTypeInfo :: String -> Field -> Q (Name, Strict, Type)Source
buildObject :: String -> String -> [Field] -> Q [Dec]Source
Build an object declaration.
buildObjectSerialisation :: String -> [Field] -> Q [Dec]Source
Generates an object definition: data type and its JSON instance.
toDictName :: String -> NameSource
genSaveObject :: (Name -> Field -> Q Exp) -> String -> [Field] -> Q [Dec]Source
saveObjectField :: Name -> Field -> Q ExpSource
objectShowJSON :: String -> Q DecSource
genLoadObject :: (Field -> Q (Name, Stmt)) -> String -> [Field] -> Q (Dec, Dec)Source
loadObjectField :: Field -> Q (Name, Stmt)Source
objectReadJSON :: String -> Q DecSource
Inheritable parameter tables implementation
paramTypeNames :: String -> (String, String)Source
paramFieldTypeInfo :: String -> Field -> Q (Name, Strict, Type)Source
buildParam :: String -> String -> [Field] -> Q [Dec]Source
Build a parameter declaration.
This function builds two different data structures: a filled one, in which all fields are required, and a partial one, in which all fields are optional. Due to the current record syntax issues, the fields need to be named differrently for the two structures, so the partial ones get a P suffix.
buildParamAllFields :: String -> [Field] -> [Dec]Source
buildDictObjectInst :: Name -> String -> [Dec]Source
buildPParamSerialisation :: String -> [Field] -> Q [Dec]Source
savePParamField :: Name -> Field -> Q ExpSource
loadPParamField :: Field -> Q (Name, Stmt)Source
buildFromMaybe :: String -> Q DecSource
Template code for exceptions
:: String | Name of new type |
-> SimpleObject | Constructor name and parameters |
-> Q [Dec] |
Builds an exception type definition.
saveExcCons :: String -> [SimpleField] -> Q ClauseSource
loadExcConstructor :: Name -> String -> [SimpleField] -> Q ExpSource
genLoadExc :: Name -> String -> SimpleObject -> Q (Dec, Dec)Source