Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JSON-RPC on APIKit

JSON-RPC on APIKit

Yosuke Ishikawa

August 31, 2016
Tweet

More Decks by Yosuke Ishikawa

Other Decks in Technology

Transcript

  1. JSON-RPC on APIKit

    View Slide

  2. View Slide

  3. APIKit
    リクエストの型に応じてレスポンスの型が変わる

    View Slide

  4. l
    e
    t r
    e
    q
    u
    e
    s
    t = P
    o
    s
    t
    T
    w
    e
    e
    t
    R
    e
    q
    u
    e
    s
    t
    (
    t
    e
    x
    t
    : "
    H
    e
    l
    l
    o
    , W
    o
    r
    l
    d
    .
    "
    )
    S
    e
    s
    s
    i
    o
    n
    .
    s
    e
    n
    d
    R
    e
    q
    u
    e
    s
    t
    (
    r
    e
    q
    u
    e
    s
    t
    ) { r
    e
    s
    u
    l
    t i
    n
    s
    w
    i
    t
    c
    h r
    e
    s
    u
    l
    t {
    c
    a
    s
    e .
    S
    u
    c
    c
    e
    s
    s
    (
    l
    e
    t t
    w
    e
    e
    t /
    * i
    s T
    w
    e
    e
    t *
    /
    )
    :
    p
    r
    i
    n
    t
    (
    "
    \
    (
    t
    w
    e
    e
    t
    .
    s
    c
    r
    e
    e
    n
    N
    a
    m
    e
    )
    : \
    (
    t
    w
    e
    e
    t
    .
    t
    e
    x
    t
    )
    "
    )
    c
    a
    s
    e .
    F
    a
    i
    l
    u
    r
    e
    (
    l
    e
    t e
    r
    r
    o
    r
    )
    :
    .
    .
    .
    }
    }

    View Slide

  5. l
    e
    t r
    e
    q
    u
    e
    s
    t = G
    e
    t
    T
    i
    m
    e
    l
    i
    n
    e
    R
    e
    q
    u
    e
    s
    t
    (
    )
    S
    e
    s
    s
    i
    o
    n
    .
    s
    e
    n
    d
    R
    e
    q
    u
    e
    s
    t
    (
    r
    e
    q
    u
    e
    s
    t
    ) { r
    e
    s
    u
    l
    t i
    n
    s
    w
    i
    t
    c
    h r
    e
    s
    u
    l
    t {
    c
    a
    s
    e .
    S
    u
    c
    c
    e
    s
    s
    (
    l
    e
    t t
    w
    e
    e
    t
    s /
    * i
    s [
    T
    w
    e
    e
    t
    ] *
    /
    )
    :
    .
    .
    .
    c
    a
    s
    e .
    F
    a
    i
    l
    u
    r
    e
    (
    l
    e
    t e
    r
    r
    o
    r
    )
    :
    .
    .
    .
    }
    }

    View Slide

  6. p
    r
    o
    t
    o
    c
    o
    l R
    e
    q
    u
    e
    s
    t
    T
    y
    p
    e {
    a
    s
    s
    o
    c
    i
    a
    t
    e
    d
    t
    y
    p
    e R
    e
    s
    p
    o
    n
    s
    e
    .
    .
    .
    }
    c
    l
    a
    s
    s S
    e
    s
    s
    i
    o
    n {
    f
    u
    n
    c s
    e
    n
    d
    R
    e
    q
    u
    e
    s
    t
    <
    R
    e
    q
    u
    e
    s
    t
    : R
    e
    q
    u
    e
    s
    t
    T
    y
    p
    e
    >
    (
    r
    e
    q
    u
    e
    s
    t
    : R
    e
    q
    u
    e
    s
    t
    ,
    h
    a
    n
    d
    l
    e
    r
    : R
    e
    s
    u
    l
    t
    <
    R
    e
    q
    u
    e
    s
    t
    .
    R
    e
    s
    p
    o
    n
    s
    e
    , E
    r
    r
    o
    r
    >
    )
    .
    .
    .
    }

    View Slide

  7. JSON-RPC
    リクエストとレスポンスをJSON
    で表す

    View Slide

  8. リクエスト
    {
    "
    i
    d
    "
    : 1
    ,
    "
    j
    s
    o
    n
    r
    p
    c
    "
    : "
    2
    .
    0
    "
    ,
    "
    m
    e
    t
    h
    o
    d
    "
    : "
    s
    u
    b
    t
    r
    a
    c
    t
    "
    ,
    "
    p
    a
    r
    a
    m
    s
    "
    : [
    4
    2
    ,
    2
    3
    ]
    }

    View Slide

  9. レスポンス
    {
    "
    i
    d
    "
    : 1
    ,
    "
    j
    s
    o
    n
    r
    p
    c
    "
    : "
    2
    .
    0
    "
    ,
    "
    r
    e
    s
    u
    l
    t
    "
    : 1
    9
    }

    View Slide

  10. 1
    回の通信で複数のリクエストも送れる

    View Slide

  11. リクエスト
    [
    {
    "
    i
    d
    "
    : 1
    ,
    "
    j
    s
    o
    n
    r
    p
    c
    "
    : "
    2
    .
    0
    "
    ,
    "
    m
    e
    t
    h
    o
    d
    "
    : "
    f
    o
    o
    "
    ,
    "
    p
    a
    r
    a
    m
    s
    "
    : { .
    .
    . }
    }
    ,
    {
    "
    i
    d
    "
    : 2
    ,
    "
    j
    s
    o
    n
    r
    p
    c
    "
    : "
    2
    .
    0
    "
    ,
    "
    m
    e
    t
    h
    o
    d
    "
    : "
    b
    a
    r
    "
    ,
    "
    p
    a
    r
    a
    m
    s
    "
    : { .
    .
    . }
    }
    ]

    View Slide

  12. レスポンス
    [
    {
    "
    i
    d
    "
    : 1
    ,
    "
    j
    s
    o
    n
    r
    p
    c
    "
    : "
    2
    .
    0
    "
    ,
    "
    r
    e
    s
    u
    l
    t
    "
    : { .
    .
    . }
    }
    ,
    {
    "
    i
    d
    "
    : 2
    ,
    "
    j
    s
    o
    n
    r
    p
    c
    "
    : "
    2
    .
    0
    "
    ,
    "
    r
    e
    s
    u
    l
    t
    "
    : { .
    .
    . }
    }
    ]

    View Slide

  13. View Slide

  14. APIKit
    リクエストの型に応じてレスポンスの型が変わる

    View Slide

  15. JSON-PRC on APIKit
    リクエストの型の組み合わせに応じて
    レスポンスの型の組み合わせが変わる

    View Slide

  16. リクエスト:
    レスポンス:

    View Slide

  17. View Slide

  18. l
    e
    t b
    a
    t
    c
    h
    R
    e
    q
    u
    e
    s
    t = B
    a
    t
    c
    h
    R
    e
    q
    u
    e
    s
    t
    (
    G
    e
    t
    B
    a
    n
    n
    e
    r
    R
    e
    q
    u
    e
    s
    t
    (
    i
    d
    : 1
    )
    ,
    G
    e
    t
    P
    o
    s
    t
    s
    R
    e
    q
    u
    e
    s
    t
    (
    i
    d
    : 1
    , c
    o
    o
    r
    d
    i
    n
    a
    t
    e
    : c
    o
    o
    r
    d
    i
    n
    a
    t
    e
    )
    ,
    G
    e
    t
    A
    d
    d
    r
    e
    s
    s
    R
    e
    q
    u
    e
    s
    t
    (
    c
    o
    o
    r
    d
    i
    n
    a
    t
    e
    : c
    o
    o
    r
    d
    i
    n
    a
    t
    e
    )
    )
    S
    e
    s
    s
    i
    o
    n
    .
    s
    e
    n
    d
    R
    e
    q
    u
    e
    s
    t
    (
    b
    a
    t
    c
    h
    R
    e
    q
    u
    e
    s
    t
    ) { r
    e
    s
    u
    l
    t i
    n
    s
    w
    i
    t
    c
    h r
    e
    s
    u
    l
    t {
    c
    a
    s
    e .
    S
    u
    c
    c
    e
    s
    s
    (
    l
    e
    t p
    o
    s
    t
    s
    , l
    e
    t b
    a
    n
    n
    e
    r
    , l
    e
    t a
    d
    d
    r
    e
    s
    s
    )
    :
    .
    .
    .
    c
    a
    s
    e .
    F
    a
    i
    l
    u
    r
    e
    (
    l
    e
    t e
    r
    r
    o
    r
    )
    :
    .
    .
    .
    }
    }

    View Slide

  19. よさそう

    View Slide

  20. 悲報
    Swi
    には可変長の型パラメー
    ター
    がない

    View Slide

  21. 任意の個数の型の組み合わせが表せない
    言語の限界だから仕方がない
    あきらめるのか...?

    View Slide

  22. せめてSwi
    らしく妥協しよう

    View Slide

  23. 参考:
    標準ライブラリ
    世界で最もSwi
    らしいコー

    View Slide

  24. f
    u
    n
    c =
    =
    <
    A
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    >
    (
    l
    h
    s
    : (
    A
    )
    , r
    h
    s
    : (
    A
    )
    ) -
    > B
    o
    o
    l
    f
    u
    n
    c =
    =
    <
    A
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    , B
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    >
    (
    l
    h
    s
    : (
    A
    , B
    )
    , r
    h
    s
    : (
    f
    u
    n
    c =
    =
    <
    A
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    , B
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    , C
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    >
    (
    l
    h
    s
    :
    f
    u
    n
    c =
    =
    <
    A
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    , B
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    , C
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    , D
    : E
    q
    u
    a
    t
    a
    b
    f
    u
    n
    c =
    =
    <
    A
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    , B
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    , C
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    , D
    : E
    q
    u
    a
    t
    a
    b
    f
    u
    n
    c =
    =
    <
    A
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    , B
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    , C
    : E
    q
    u
    a
    t
    a
    b
    l
    e
    , D
    : E
    q
    u
    a
    t
    a
    b
    任意の個数の型の組み合わせ(6
    個まで)

    View Slide

  25. 筋肉
    これがSwi
    のやり方

    View Slide

  26. 理想:
    任意の数のリクエストの組み合わせ
    現実:
    最大3
    個のリクエストの組み合わせ

    View Slide

  27. c
    l
    a
    s
    s B
    a
    t
    c
    h
    F
    a
    c
    t
    o
    r
    y {
    .
    .
    .
    f
    u
    n
    c c
    r
    e
    a
    t
    e
    <
    R
    1
    : R
    e
    q
    u
    e
    s
    t
    T
    y
    p
    e
    >
    (
    r
    e
    q
    u
    e
    s
    t
    : R
    1
    ) -
    > B
    a
    t
    c
    h
    <
    f
    u
    n
    c c
    r
    e
    a
    t
    e
    <
    R
    1
    : R
    e
    q
    u
    e
    s
    t
    T
    y
    p
    e
    , R
    2
    : R
    e
    q
    u
    e
    s
    t
    T
    y
    p
    e
    >
    (
    r
    e
    q
    u
    e
    s
    t
    1
    :
    f
    u
    n
    c c
    r
    e
    a
    t
    e
    <
    R
    1
    : R
    e
    q
    u
    e
    s
    t
    T
    y
    p
    e
    , R
    2
    : R
    e
    q
    u
    e
    s
    t
    T
    y
    p
    e
    , R
    3
    : R
    e
    q
    u
    e
    s
    }

    View Slide

  28. https://github.com/bricklife/JSONRPCKit
    1.0.0 beta 1

    View Slide

  29. 筋肉最高!

    View Slide

  30. 筋肉最高?

    View Slide

  31. Swi 4 or later

    View Slide

  32. Generics Manifesto
    将来実装される可能性がある
    おしゃれコー
    ド一覧

    View Slide

  33. Variadic Generics

    View Slide

  34. s
    t
    r
    u
    c
    t B
    a
    t
    c
    h
    R
    e
    q
    u
    e
    s
    t
    <
    .
    .
    . R
    e
    q
    u
    e
    s
    t
    s
    : R
    e
    q
    u
    e
    s
    t
    T
    y
    p
    e
    >
    : R
    e
    q
    u
    e
    s
    t
    T
    y
    p
    e
    t
    y
    p
    e
    a
    l
    i
    a
    s R
    e
    s
    p
    o
    n
    s
    e = (
    R
    e
    q
    u
    e
    s
    t
    s
    .
    R
    e
    s
    p
    o
    n
    s
    e
    .
    .
    .
    )
    l
    e
    t (
    .
    .
    .
    r
    e
    q
    u
    e
    s
    t
    s
    )
    : (
    R
    e
    q
    u
    e
    s
    t
    s
    .
    .
    .
    )
    .
    .
    .
    }

    View Slide

  35. 筋肉の時代は終わるのかも?

    View Slide