Slide 1

Slide 1 text

JSON-RPC on APIKit

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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 ) : . . . } }

Slide 5

Slide 5 text

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 ) : . . . } }

Slide 6

Slide 6 text

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 > ) . . . }

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

リクエスト { " 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 ] }

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

リクエスト [ { " 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 " : { . . . } } ]

Slide 12

Slide 12 text

レスポンス [ { " 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 " : { . . . } } ]

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

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 ) : . . . } }

Slide 19

Slide 19 text

よさそう

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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 個まで)

Slide 25

Slide 25 text

筋肉 これがSwi のやり方

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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 }

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

筋肉最高!

Slide 30

Slide 30 text

筋肉最高?

Slide 31

Slide 31 text

Swi 4 or later

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

Variadic Generics

Slide 34

Slide 34 text

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 . . . ) . . . }

Slide 35

Slide 35 text

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