module LangUtils where
import qualified Data.Set as S
import Language.Abs
import qualified TypeCheck.ApiSpec as AS
specName :: Specification
-> String
specName (Spec (Nm (Ident n)) _ _ _ _ _) = n
specVersion :: Specification
-> String
specVersion (Spec _(Ver (VerIdent v)) _ _ _ _) = v
enumName :: EnumType
-> String
enumName (DefEnum (Ident name) _) = name
enumVals :: EnumType
-> [EnumVal]
enumVals (DefEnum _ vals) = vals
enumValName :: EnumVal
-> String
enumValName (EnVal (Ident name)) = name
strName :: StructType
-> String
strName (DefStr (Ident name) _) = name
strFields :: StructType
-> [Field]
strFields (DefStr _ fields) = fields
resName :: Resource
-> String
resName (Res (Ident name) _ _) = name
resRoute :: Resource
-> String
resRoute (Res _ (RouteIdent route) _) = route
resIsWritable :: Resource
-> Bool
resIsWritable (Res _ _ mode) = mode == Write
fieldName :: Field
-> String
fieldName (FDef _ (Ident name) _) = name
fieldAnnotations :: Field
-> [Annotation]
fieldAnnotations (FDef annotations _ _) = annotations
fieldType :: Field
-> FType
fieldType (FDef _ _ ft) = ft
fieldSpecType :: (S.Set String, S.Set String)
-> FType
-> AS.Type
fieldSpecType _ FString = AS.TString
fieldSpecType _ FInt = AS.TInt
fieldSpecType _ FLong = AS.TLong
fieldSpecType _ FDouble = AS.TDouble
fieldSpecType (strs, enums) (FDefined (Ident n)) | n `S.member` enums = AS.TEnum n
| n `S.member` strs = AS.TStruct n
| otherwise = error $ "getType: " ++ n ++ " is not defined."
fieldSpecType as (FList type') = AS.TList $ fieldSpecType as type'