OAUTH для Purescript - PullRequest
       12

OAUTH для Purescript

1 голос
/ 05 марта 2019

Я новичок в Purescript. Я ищу клиента OAuth и нашел этот . Я не уверен, как это сделать, но это то, что я пытался.

Я скопировал исходный код в соответствии с первым проектом, созданным в соответствии с руководством по началу работы. Первая ошибка, когда я pulp build был

Error 1 of 3:

  at src\Network\OAuth.purs:138:1 - 138:1 (line 138, column 1 - line 138, column 1)

    Unable to parse module:
    expecting indentation past column 1

, который я исправил, закомментировав незаконченный токен ByAuthorizationToken , верно?

Но тогда я получаю

Error 1 of 3:

  at src\Network\OAuth.purs:228:3 - 228:3 (line 228, column 3 - line 228, column 3)

    Unable to parse module:
    unexpected {
    expecting data constructor name

Как мне исправить следующий код (при условии, что все, что я делал до сих пор, в порядке ... чего я тоже не знаю)?

data TokenEndpointSuccessResponse a =
  { access_token :: a -- See 7.1: Access Token Types
  , token_type :: AccessTokenType
  , expires_in :: Maybe Seconds -- recommended
  , refresh_token :: Maybe RefreshToken
  , scope :: Maybe AccessScope
  }

Я просматривал документацию для типов и синтаксиса , и я не мог сразу определить ошибку (, за исключением того, что я пишу в следующем ). В частности, кажется правильным определение записи, согласно правилу языка

Записи PureScript соответствуют объектам JavaScript. Они могут иметь ноль или более именованных полей, каждое со своими собственными типами. Например: {name :: String, greet :: String -> String } соответствует JavaScript-объект с точно двумя полями: name, который является String, и greet, которая является функцией, которая принимает String и возвращает String.

Итак, я выполнил эксперимент, добавив пару строк перед ошибкой, которые являются экстраполяцией документации для ключевого слова data и другого вопроса о типе записи

data Foo a = Foo | Bar a

type ThreeStringProps = {prop1:: string, prop2:: string, prop3:: string}

и обе вышеуказанные строки компилируются нормально, а также следующие

type Foo a = {foo :: Foo | bar :: Bar a}

так что, думаю, мне нужно заменить data на type, но имеет ли это смысл? Кажется, работает следующее исправление (но у меня есть другие ошибки в других файлах кода из github ...)

type TokenEndpointSuccessResponse a = { access_token :: a -- See 7.1: Access Token Types
  , token_type :: AccessTokenType
  , expires_in :: Maybe Seconds -- recommended
  , refresh_token :: Maybe RefreshToken
  , scope :: Maybe AccessScope
  }

В любом случае, я на правильном пути (для реализации клиента OAuth в Purescript)?

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

На практике я связывался с chexxor и видел его мысли.Эта библиотека была написана до PureScript 0.12 и поэтому потребует многочисленных изменений для обеспечения совместимости.

type и data - это две разные вещи.type вводит синоним типа (другое имя для существующего типа), тогда как data вводит алгебраический тип данных (различимые суммы и произведения других типов).

Записи - это тоже что-то другое.{ a ∷ A } по определению эквивалентен Record (a ∷ A).

Строка 228 не анализируется, поскольку отсутствует имя конструктора.data X = { a ∷ A } - недопустимый синтаксис, data X = Y { a ∷ A } - допустимый синтаксис.

0 голосов
/ 09 мая 2019

Я ищу клиента OAuth и нашел его.

Вы нашли незаконченный проект, тогда как лучшим подходом было бы написание привязки для npm.модуль oauth .

Прежде всего, если вы планируете интегрировать с Twitter, рассмотрите возможность получения токена доступа по узлу, запустите twitter_oauth_getter.js (обратите внимание на оба комментария).

Затем заменитесекреты 2 + 2 (ключи приложения и пользователя) в oauth.get и, наконец, экспортируйте их как модуль незанятых функций.

Например, допустим, вы просто хотите вывести несколько твитов, вы можете передатьlog функционирует как эффективный обратный вызов .

"use strict";
module.exports = {
sayHelloInEnglish: function() {
return "HELLO";
},

logMyTweets: function(callback) {
var OAuth = require('oauth');

    var oauth = new OAuth.OAuth(
      'https://api.twitter.com/oauth/request_token',
      'https://api.twitter.com/oauth/access_token',
      'app key',
      'app token',
      '1.0A',
      null,
      'HMAC-SHA1'
    );
    oauth.get(
      'https://api.twitter.com/1.1/lists/statuses.json?slug=develop&owner_screen_name=giuliohome_2017&count=2',
      //'https://api.twitter.com/1.1/trends/place.json?id=23424977',
      'user token', 
      'user secret', 
      function (e, data, res){
        if (e) console.error(e);        
        callback (data);
      }); 

}
};

Привязка Purescript

Теперь, следуя приведенному выше примеру, вы напишите привязку Purescript (то же имя срасширение .purs вместо .js)

module Twitting where
import Data.Unit
import Data.Function.Uncurried (Fn0, Fn1)
import Effect (Effect)
import Effect.Uncurried
foreign import sayHelloInEnglish ::  Fn0 String
foreign import logMyTweets ::  EffectFn1 (EffectFn1 String Unit) Unit

И вариант использования может быть

module Main where

import Prelude
import Effect (Effect)
import Effect.Console (log)
import Twitting
import Data.Function.Uncurried (Fn0, runFn0, Fn1, runFn1)
import Effect.Uncurried (runEffectFn1, mkEffectFn1)

callback :: String -> Effect Unit
callback = log

main :: Effect Unit
main = do
  log "Hello sailor!"
  log (runFn0 sayHelloInEnglish)
  runEffectFn1 logMyTweets (mkEffectFn1 callback)

Следующие шаги

Теперь, конечно, мы можем продолжить с Аргонавты

Поскольку наша программа получает JSON данные в виде строки, нам, вероятно, нужна функция jsonParser в Data.Argonaut.Parser, которая является очень простой оболочкой для JavaScript JSON.parse.В противном случае значения Json могут быть введены в нашу программу через FFI

concat :: forall a. Foldable a => a String -> String
concat tt =
  foldl (\a x -> x <> "\n" <> a) "" tt

showText :: Object A.Json -> String
showText tweet =
   maybe "no text" A.stringify (lookup "text" tweet)

toJsonObject :: A.Json -> String
toJsonObject j =
  A.caseJsonObject "not a json object " showText j

transform :: Array A.Json -> Array String
transform e = map toJsonObject e

showTweets :: A.Json -> Array String
showTweets tweets =
  A.caseJsonArray ["not a json array"] transform tweets

parse :: String -> String
parse j = 
  either (\x -> x <> "\n" <> j) (\x -> concat( showTweets x)) (jsonParser j)

callback :: String -> Effect Unit
callback j = do
  log (parse j)

Наконец, если мы находимся на стороне сервера, мы, вероятно, опубликуем веб-приложение, используя HTTP-сервер, такой как гипер-

...