at_commands/
translate_response.rs

1// Copyright 2021 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5//! Code to raise and lower Response types.  This wraps the generated code to raise and lower
6//! the generated Success types with handling for errors and other types of responses.
7
8use crate::generated::translate::{lower_success, raise_success};
9use crate::serde::DeserializeErrorCause;
10use crate::{highlevel, lowlevel};
11
12pub fn raise_response(
13    lowlevel: &lowlevel::Response,
14) -> Result<highlevel::Response, DeserializeErrorCause> {
15    let highlevel = match lowlevel {
16        lowlevel::Response::Ok => highlevel::Response::Ok,
17        lowlevel::Response::Error => highlevel::Response::Error,
18        lowlevel::Response::HardcodedError(err) => {
19            highlevel::Response::HardcodedError(raise_hardcoded_error(err))
20        }
21        lowlevel::Response::CmeError(err_code) => highlevel::Response::CmeError(*err_code),
22        lowlevel::Response::Success { .. } => {
23            let hl = raise_success(lowlevel)?;
24            highlevel::Response::Success(hl)
25        }
26        lowlevel::Response::RawBytes(bytes) => highlevel::Response::RawBytes(bytes.clone()),
27    };
28
29    Ok(highlevel)
30}
31
32fn raise_hardcoded_error(lowlevel: &lowlevel::HardcodedError) -> highlevel::HardcodedError {
33    match lowlevel {
34        lowlevel::HardcodedError::NoCarrier => highlevel::HardcodedError::NoCarrier,
35        lowlevel::HardcodedError::Busy => highlevel::HardcodedError::Busy,
36        lowlevel::HardcodedError::NoAnswer => highlevel::HardcodedError::NoAnswer,
37        lowlevel::HardcodedError::Delayed => highlevel::HardcodedError::Delayed,
38        lowlevel::HardcodedError::Blacklist => highlevel::HardcodedError::Blacklist,
39    }
40}
41
42pub fn lower_response(highlevel: &highlevel::Response) -> lowlevel::Response {
43    match highlevel {
44        highlevel::Response::Ok => lowlevel::Response::Ok,
45        highlevel::Response::Error => lowlevel::Response::Error,
46        highlevel::Response::HardcodedError(err) => {
47            lowlevel::Response::HardcodedError(lower_hardcoded_error(err))
48        }
49        highlevel::Response::CmeError(err_code) => lowlevel::Response::CmeError(*err_code),
50        highlevel::Response::Success(success) => lower_success(success),
51        highlevel::Response::RawBytes(bytes) => lowlevel::Response::RawBytes(bytes.clone()),
52    }
53}
54
55fn lower_hardcoded_error(highlevel: &highlevel::HardcodedError) -> lowlevel::HardcodedError {
56    match highlevel {
57        highlevel::HardcodedError::NoCarrier => lowlevel::HardcodedError::NoCarrier,
58        highlevel::HardcodedError::Busy => lowlevel::HardcodedError::Busy,
59        highlevel::HardcodedError::NoAnswer => lowlevel::HardcodedError::NoAnswer,
60        highlevel::HardcodedError::Delayed => lowlevel::HardcodedError::Delayed,
61        highlevel::HardcodedError::Blacklist => lowlevel::HardcodedError::Blacklist,
62    }
63}