@@ -147,6 +147,7 @@ pub struct ApprovalInfo {
147147#[ derive( Debug , Clone , PartialEq ) ]
148148pub enum ApprovalStatus {
149149 NotApproved ,
150+ ApprovalPending ( ApprovalInfo ) ,
150151 Approved ( ApprovalInfo ) ,
151152}
152153
@@ -158,23 +159,33 @@ impl sqlx::Type<sqlx::Postgres> for ApprovalStatus {
158159
159160impl < ' r > sqlx:: Decode < ' r , sqlx:: Postgres > for ApprovalStatus {
160161 fn decode ( value : sqlx:: postgres:: PgValueRef < ' r > ) -> Result < Self , BoxDynError > {
161- let ( approver, sha, approved_at) =
162- <( Option < String > , Option < String > , Option < DateTime < Utc > > ) as sqlx:: Decode <
163- sqlx:: Postgres ,
164- > >:: decode ( value) ?;
165-
166- match ( approver, sha, approved_at) {
167- ( Some ( approver) , Some ( sha) , Some ( approved_at) ) => {
162+ let ( approver, sha, approved_at, is_pending) =
163+ <(
164+ Option < String > ,
165+ Option < String > ,
166+ Option < DateTime < Utc > > ,
167+ Option < bool > ,
168+ ) as sqlx:: Decode < sqlx:: Postgres > >:: decode ( value) ?;
169+
170+ match ( approver, sha, approved_at, is_pending) {
171+ ( Some ( approver) , Some ( sha) , Some ( approved_at) , Some ( true ) ) => {
172+ Ok ( ApprovalStatus :: ApprovalPending ( ApprovalInfo {
173+ approver,
174+ sha,
175+ approved_at,
176+ } ) )
177+ }
178+ ( Some ( approver) , Some ( sha) , Some ( approved_at) , Some ( false ) | None ) => {
168179 Ok ( ApprovalStatus :: Approved ( ApprovalInfo {
169180 approver,
170181 sha,
171182 approved_at,
172183 } ) )
173184 }
174- ( None , None , None ) => Ok ( ApprovalStatus :: NotApproved ) ,
175- ( approver, sha, approved_at) => Err ( format ! (
176- "Inconsistent approval state: approver={:?}, sha={:?}, approved_at={:?}" ,
177- approver, sha, approved_at
185+ ( None , None , None , _ ) => Ok ( ApprovalStatus :: NotApproved ) ,
186+ ( approver, sha, approved_at, is_pending ) => Err ( format ! (
187+ "Inconsistent approval state: approver={:?}, sha={:?}, approved_at={:?}, is_pending={:?} " ,
188+ approver, sha, approved_at, is_pending
178189 )
179190 . into ( ) ) ,
180191 }
@@ -258,16 +269,24 @@ impl PullRequestModel {
258269 matches ! ( self . approval_status, ApprovalStatus :: Approved ( _) )
259270 }
260271
272+ pub fn is_pending_approval ( & self ) -> bool {
273+ matches ! ( self . approval_status, ApprovalStatus :: ApprovalPending ( _) )
274+ }
275+
261276 pub fn approver ( & self ) -> Option < & str > {
262277 match & self . approval_status {
263- ApprovalStatus :: Approved ( info) => Some ( info. approver . as_str ( ) ) ,
278+ ApprovalStatus :: Approved ( info) | ApprovalStatus :: ApprovalPending ( info) => {
279+ Some ( info. approver . as_str ( ) )
280+ }
264281 ApprovalStatus :: NotApproved => None ,
265282 }
266283 }
267284
268285 pub fn approved_sha ( & self ) -> Option < & str > {
269286 match & self . approval_status {
270- ApprovalStatus :: Approved ( info) => Some ( info. sha . as_str ( ) ) ,
287+ ApprovalStatus :: Approved ( info) | ApprovalStatus :: ApprovalPending ( info) => {
288+ Some ( info. sha . as_str ( ) )
289+ }
271290 ApprovalStatus :: NotApproved => None ,
272291 }
273292 }
0 commit comments