Skip to content

Commit

Permalink
decode_request_body の返り値の型が一意に定まるように Union の使い方を修正
Browse files Browse the repository at this point in the history
  • Loading branch information
euglena1215 committed May 28, 2024
1 parent a041faa commit 5278c44
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 15 deletions.
4 changes: 1 addition & 3 deletions webapp/ruby/Steepfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,5 @@ target :app do

library "json", "securerandom", "base64", "digest"

configure_code_diagnostics do |hash|
hash[D::Ruby::MethodDefinitionMissing] = :warning
end
configure_code_diagnostics(D::Ruby.all_error)
end
21 changes: 12 additions & 9 deletions webapp/ruby/app.rb
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,18 @@ def db_transaction(&block)
end
end

# singleton(T) が動いてほしいなあ
#:: (singleton(ReserveLivestreamRequest) | singleton(PostLivecommentRequest) | singleton(ModerateRequest) | singleton(PostReactionRequest) | singleton(PostIconRequest) | singleton(PostUserRequest) | singleton(LoginRequest) data_class) -> (ReserveLivestreamRequest | PostLivecommentRequest | ModerateRequest | PostReactionRequest | PostIconRequest | PostUserRequest | LoginRequest)
# #::記法ではオーバーロードが無視されるバグ?を回避するため @rbs! で記述
# ref. https://github.com/soutaro/rbs-inline/issues/36
# @rbs!
# def decode_request_body: (singleton(ReserveLivestreamRequest)) -> ReserveLivestreamRequest
# | (singleton(PostLivecommentRequest)) -> PostLivecommentRequest
# | (singleton(ModerateRequest)) -> ModerateRequest
# | (singleton(PostReactionRequest)) -> PostReactionRequest
# | (singleton(PostIconRequest)) -> PostIconRequest
# | (singleton(PostUserRequest)) -> PostUserRequest
# | (singleton(LoginRequest)) -> LoginRequest

# @rbs skip
def decode_request_body(data_class)
body = JSON.parse(request.body.tap(&:rewind).read, symbolize_names: true)
data_class.new(**data_class.members.map { |key| [key, body[key]] }.to_h)
Expand Down Expand Up @@ -309,7 +319,6 @@ def fill_user_response(tx, user_model)
end

req = decode_request_body(ReserveLivestreamRequest)
raise unless req.is_a?(ReserveLivestreamRequest)

livestream = db_transaction do |tx|
# 2023/11/25 10:00からの1年間の期間内であるかチェック
Expand Down Expand Up @@ -591,7 +600,6 @@ def fill_user_response(tx, user_model)
livestream_id = cast_as_integer(params[:livestream_id])

req = decode_request_body(PostLivecommentRequest)
raise unless req.is_a?(PostLivecommentRequest)

livecomment = db_transaction do |tx|
livestream_model = tx.xquery('SELECT * FROM livestreams WHERE id = ?', livestream_id).first
Expand Down Expand Up @@ -705,7 +713,6 @@ def fill_user_response(tx, user_model)
livestream_id = cast_as_integer(params[:livestream_id])

req = decode_request_body(ModerateRequest)
raise unless req.is_a?(ModerateRequest)

word_id = db_transaction do |tx|
# 配信者自身の配信に対するmoderateなのかを検証
Expand Down Expand Up @@ -790,7 +797,6 @@ def fill_user_response(tx, user_model)
livestream_id = Integer(params[:livestream_id], 10)

req = decode_request_body(PostReactionRequest)
raise unless req.is_a?(PostReactionRequest)

reaction = db_transaction do |tx|
created_at = Time.now.to_i
Expand Down Expand Up @@ -856,7 +862,6 @@ def fill_user_response(tx, user_model)
end

req = decode_request_body(PostIconRequest)
raise unless req.is_a?(PostIconRequest)
image = Base64.decode64(req.image)

icon_id = db_transaction do |tx|
Expand Down Expand Up @@ -919,7 +924,6 @@ def fill_user_response(tx, user_model)
# ユーザ登録API
post '/api/register' do
req = decode_request_body(PostUserRequest)
raise unless req.is_a?(PostUserRequest)
if req.name == 'pipe'
raise HttpError.new(400, "the username 'pipe' is reserved")
end
Expand Down Expand Up @@ -968,7 +972,6 @@ def fill_user_response(tx, user_model)
# ユーザログインAPI
post '/api/login' do
req = decode_request_body(LoginRequest)
raise unless req.is_a?(LoginRequest)

user_model = db_transaction do |tx|
# usernameはUNIQUEなので、whereで一意に特定できる
Expand Down
10 changes: 7 additions & 3 deletions webapp/ruby/sig/generated/app.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,13 @@ module Isupipe
# :: [T] () { (Mysql2::Client[Mysql2::ResultAsHash]) -> T } -> T
def db_transaction: [T] () { (Mysql2::Client[Mysql2::ResultAsHash]) -> T } -> T

# singleton(T) が動いてほしいなあ
# :: (singleton(ReserveLivestreamRequest) | singleton(PostLivecommentRequest) | singleton(ModerateRequest) | singleton(PostReactionRequest) | singleton(PostIconRequest) | singleton(PostUserRequest) | singleton(LoginRequest) data_class) -> (ReserveLivestreamRequest | PostLivecommentRequest | ModerateRequest | PostReactionRequest | PostIconRequest | PostUserRequest | LoginRequest)
def decode_request_body: (singleton(ReserveLivestreamRequest) | singleton(PostLivecommentRequest) | singleton(ModerateRequest) | singleton(PostReactionRequest) | singleton(PostIconRequest) | singleton(PostUserRequest) | singleton(LoginRequest) data_class) -> (ReserveLivestreamRequest | PostLivecommentRequest | ModerateRequest | PostReactionRequest | PostIconRequest | PostUserRequest | LoginRequest)
def decode_request_body: (singleton(ReserveLivestreamRequest)) -> ReserveLivestreamRequest
| (singleton(PostLivecommentRequest)) -> PostLivecommentRequest
| (singleton(ModerateRequest)) -> ModerateRequest
| (singleton(PostReactionRequest)) -> PostReactionRequest
| (singleton(PostIconRequest)) -> PostIconRequest
| (singleton(PostUserRequest)) -> PostUserRequest
| (singleton(LoginRequest)) -> LoginRequest

# @rbs str: String
# @rbs returns Integer
Expand Down

0 comments on commit 5278c44

Please sign in to comment.