package omadaapi import ( "fmt" "git.tordarus.net/tordarus/omada-api/model" ) const ErrCodeAccessTokenExpired = -44112 const ErrCodeRefreshTokenExpired = -44114 func handleResponseErrors[T any](api *Api, response *model.Response[T], retry func() (*model.Response[T], error)) (*model.Response[T], error) { switch response.ErrorCode { case 0: return response, nil case ErrCodeAccessTokenExpired: if err := api.Refresh(); err != nil { return nil, fmt.Errorf("could not refresh access token: %w", err) } newResp, err := retry() if err != nil { return nil, err } return handleResponseErrors(api, newResp, retry) case ErrCodeRefreshTokenExpired: if err := api.InitSession(); err != nil { return nil, fmt.Errorf("could not initialize new session: %w", err) } newResp, err := retry() if err != nil { return nil, err } return handleResponseErrors(api, newResp, retry) default: return nil, fmt.Errorf("invalid error code %d with message: %s", response.ErrorCode, response.Message) } } func handlePagedResponseErrors[T any](api *Api, response *model.PagedResponse[T], retry func() (*model.PagedResponse[T], error)) (*model.PagedResponse[T], error) { switch response.ErrorCode { case 0: return response, nil case ErrCodeAccessTokenExpired: if err := api.Refresh(); err != nil { return nil, fmt.Errorf("could not refresh access token: %w", err) } newResp, err := retry() if err != nil { return nil, err } return handlePagedResponseErrors(api, newResp, retry) case ErrCodeRefreshTokenExpired: if err := api.InitSession(); err != nil { return nil, fmt.Errorf("could not initialize new session: %w", err) } newResp, err := retry() if err != nil { return nil, err } return handlePagedResponseErrors(api, newResp, retry) default: return nil, fmt.Errorf("invalid error code %d with message: %s", response.ErrorCode, response.Message) } }