2017-10-13 5 views
0

HTTPクライアントパッケージTeslaのソースコードを見ていて、Tesla.get/2関数のソースを見つけようとしていますが、他のhttpメソッドの関数と同じようにここで見つけることはできません。 BTWは、オンラインドキュメントからの 'ソースの表示'リンクもできません。私はうんざりしている、誰かがこれを説明することができますか?メソッドの関数呼び出しはElixir Teslaでどのように定義されていますか?ソースコードはどこにありますか?

答えて

1

このパッケージは、メタプログラミングを使用してすべてのHTTP動詞の機能を生成しています。動詞の名前がこのリストには、繰り返し処理され、機能が動的に各hereのために生成されhere

@http_verbs ~w(head get delete trace options post put patch)a 

を定義しています。各関数の実際の本体は、generate_api関数hereで定義されています。だから、Tesla.get/2の実際のソースはthisです:

def unquote(method)(url, body) do 
    request(method: unquote(method), url: url, body: body) 
end 

あなたは:getmethodに置き換えた場合、あなたはTesla.get/2の効果的な定義を取得:

def get(url, body) do 
    request(method: :get, url: url, body: body) 
end 

あなたがのコンパイルErlangのフォームを読むことができますモジュールのコードも同様です:

{_, _, bytecode} = :code.get_object_code(Tesla) 
{:ok, {_, [{:abstract_code, {_, ac}}]}} = :beam_lib.chunks(bytecode, [:abstract_code]) 
ac |> :erl_syntax.form_list |> :erl_prettypr.format |> IO.puts 

出力は巨大ですが、あなたは慎重に見れば、あなたは、生成されたすべてのget/2節わかります

... 

get(#{'__struct__' := 'Elixir.Tesla.Client'} = [email protected], 
    [email protected]) -> 
    request([email protected], [{method, get}, {url, [email protected]}]); 
get([email protected], [email protected]) when erlang:is_function([email protected]) -> 
    get(#{post => [], pre => [], 'fun' => [email protected], 
     '__struct__' => 'Elixir.Tesla.Client'}, 
    [email protected]); 
get([email protected], [email protected]) when erlang:is_list([email protected]) -> 
    request([{method, get}, {url, [email protected]}] ++ [email protected]). 

... 
関連する問題