Parse proc arg definitions that have multi-word types
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Vendored
+1
-1
@@ -226,7 +226,7 @@ CREATE FUNCTION varied_arguments(
|
|||||||
) RETURNS text
|
) RETURNS text
|
||||||
LANGUAGE sql
|
LANGUAGE sql
|
||||||
AS $_$
|
AS $_$
|
||||||
SELECT 'Hi';
|
SELECT 'Hi'::text;
|
||||||
$_$;
|
$_$;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user