Parse proc arg definitions that have multi-word types

This commit is contained in:
Joe Nelson
2016-09-22 23:30:47 -07:00
parent 539df21627
commit a88a704bef
3 changed files with 45 additions and 15 deletions
+12 -6
View File
@@ -16,7 +16,9 @@ import Control.Applicative
import Data.List (elemIndex) import Data.List (elemIndex)
import Data.Maybe (fromJust) import Data.Maybe (fromJust)
import Data.Monoid import Data.Monoid
import Data.Text (split, strip) import Data.Text (split, strip,
breakOn, dropAround)
import qualified Data.Text as T
import qualified Hasql.Session as H import qualified Hasql.Session as H
import PostgREST.Types import PostgREST.Types
import Text.InterpolatedString.Perl6 (q) import Text.InterpolatedString.Perl6 (q)
@@ -106,12 +108,16 @@ accessibleProcs =
addName pd = (pdName pd, pd) addName pd = (pdName pd, pd)
parseArgs :: Text -> [PgArg] parseArgs :: Text -> [PgArg]
parseArgs = mapMaybe (toks2arg . split (==' ') . strip) . split (==',') parseArgs = mapMaybe (parseArg . strip) . split (==',')
toks2arg :: [Text] -> Maybe PgArg parseArg :: Text -> Maybe PgArg
toks2arg (x:y:"DEFAULT":_) = Just (PgArg x y False) parseArg a =
toks2arg (x:y:_) = Just (PgArg x y True) let (body, def) = breakOn " DEFAULT " a
toks2arg _ = Nothing (name, typ) = breakOn " " body in
if T.null typ
then Nothing
else Just $
PgArg (dropAround (== '"') name) (strip typ) (T.null def)
sql = [q| sql = [q|
SELECT p.proname as "proc_name", SELECT p.proname as "proc_name",
+32 -8
View File
@@ -33,25 +33,49 @@ spec = do
. key "post" . key "parameters" . key "post" . key "parameters"
. nth 0 . key "schema" . nth 0 . key "schema"
. key "$ref" . _String . key "$ref" . _String
login = r ^? key "definitions" . key "(rpc) varied_arguments" args = r ^? key "definitions" . key "(rpc) varied_arguments"
liftIO $ do liftIO $ do
ref `shouldBe` Just "#/definitions/(rpc) varied_arguments" ref `shouldBe` Just "#/definitions/(rpc) varied_arguments"
login `shouldBe` Just args `shouldBe` Just
[aesonQQ| [aesonQQ|
{ {
"required": [ "required": [
"id", "double",
"pass" "varchar",
"boolean",
"date",
"money",
"enum"
], ],
"properties": { "properties": {
"id": { "double": {
"format": "text", "format": "double precision",
"type": "string" "type": "string"
}, },
"pass": { "varchar": {
"format": "text", "format": "character varying",
"type": "string" "type": "string"
},
"boolean": {
"format": "boolean",
"type": "boolean"
},
"date": {
"format": "date",
"type": "string"
},
"money": {
"format": "money",
"type": "string"
},
"enum": {
"format": "test.enum_menagerie_type",
"type": "string"
},
"integer": {
"format": "integer",
"type": "integer"
} }
}, },
"type": "object" "type": "object"
+1 -1
View File
@@ -226,7 +226,7 @@ CREATE FUNCTION varied_arguments(
) RETURNS text ) RETURNS text
LANGUAGE sql LANGUAGE sql
AS $_$ AS $_$
SELECT 'Hi'; SELECT 'Hi'::text;
$_$; $_$;