rust/chg/src/clientext.rs
author Matt Harbison <matt_harbison@yahoo.com>
Sat, 05 Oct 2024 15:00:37 -0400
changeset 51940 54d9f496f07a
parent 45620 426294d06ddc
permissions -rw-r--r--
interfaces: introduce and use a protocol class for the `charencoding` module See f2832de2a46c for details when this was done for the `bdiff` module. This lets us dump the hack where the `pure` implementation was imported during the type checking phase to provide signatures for the module methods it provides. Now the protocol classes are starting to shine, because these methods are provided by `pure.charencoding` and `cext.parsers`, and references to `cffi.charencoding` and `cext.charencoding` are forwarded to them as appropriate by the `policy` module. But none of that matters, as long as the module returned provides the listed methods. The interface was copy/pasted from the `pure` module, but `jsonescapeu8fallback` is omitted because it is accessed from the `pure` module directly when the escaping fails in the primary module's `jsonescapeu8()`.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39977
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     1
// Copyright 2018 Yuya Nishihara <yuya@tcha.org>
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     2
//
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     3
// This software may be used and distributed according to the terms of the
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     4
// GNU General Public License version 2 or any later version.
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     5
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     6
//! cHg extensions to command server client.
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     7
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
     8
use bytes::{BufMut, BytesMut};
39977
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
     9
use std::ffi::OsStr;
44680
43513444bb88 rust-chg: add interface to run "validate" request
Yuya Nishihara <yuya@tcha.org>
parents: 44675
diff changeset
    10
use std::io;
44683
065048e66f32 rust-chg: send client side umask to server
Yuya Nishihara <yuya@tcha.org>
parents: 44680
diff changeset
    11
use std::mem;
39978
045ea159418d rust-chg: add interface to chdir the server
Yuya Nishihara <yuya@tcha.org>
parents: 39977
diff changeset
    12
use std::os::unix::ffi::OsStrExt;
39977
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    13
use std::os::unix::io::AsRawFd;
39978
045ea159418d rust-chg: add interface to chdir the server
Yuya Nishihara <yuya@tcha.org>
parents: 39977
diff changeset
    14
use std::path::Path;
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    15
use tokio_hglib::UnixClient;
39977
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    16
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    17
use crate::attachio;
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    18
use crate::message::{self, Instruction, ServerSpec};
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    19
use crate::runcommand;
44689
6bef9d43cc55 rust-chg: use "crate::" to import local modules
Yuya Nishihara <yuya@tcha.org>
parents: 44684
diff changeset
    20
use crate::uihandler::SystemHandler;
39977
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    21
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    22
/// Command-server client that also supports cHg extensions.
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    23
pub struct ChgClient {
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    24
    client: UnixClient,
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    25
}
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    26
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    27
impl ChgClient {
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    28
    /// Connects to a command server listening at the specified socket path.
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    29
    pub async fn connect(path: impl AsRef<Path>) -> io::Result<Self> {
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    30
        let client = UnixClient::connect(path).await?;
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    31
        Ok(ChgClient { client })
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    32
    }
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    33
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    34
    /// Server capabilities, encoding, etc.
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    35
    pub fn server_spec(&self) -> &ServerSpec {
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    36
        self.client.server_spec()
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    37
    }
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    38
39977
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    39
    /// Attaches the client file descriptors to the server.
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    40
    pub async fn attach_io(
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    41
        &mut self,
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    42
        stdin: &impl AsRawFd,
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    43
        stdout: &impl AsRawFd,
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    44
        stderr: &impl AsRawFd,
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    45
    ) -> io::Result<()> {
45620
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    46
        attachio::attach_io(
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    47
            self.client.borrow_protocol_mut(),
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    48
            stdin,
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    49
            stdout,
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    50
            stderr,
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    51
        )
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    52
        .await
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    53
    }
39977
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
    54
39978
045ea159418d rust-chg: add interface to chdir the server
Yuya Nishihara <yuya@tcha.org>
parents: 39977
diff changeset
    55
    /// Changes the working directory of the server.
45620
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    56
    pub async fn set_current_dir(
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    57
        &mut self,
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    58
        dir: impl AsRef<Path>,
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    59
    ) -> io::Result<()> {
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    60
        let dir_bytes = dir.as_ref().as_os_str().as_bytes().to_owned();
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    61
        self.client
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    62
            .borrow_protocol_mut()
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    63
            .send_command_with_args("chdir", dir_bytes)
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    64
            .await
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    65
    }
39978
045ea159418d rust-chg: add interface to chdir the server
Yuya Nishihara <yuya@tcha.org>
parents: 39977
diff changeset
    66
44675
97e6d435ff7e rust-chg: send client-side environment variables to server
Yuya Nishihara <yuya@tcha.org>
parents: 43818
diff changeset
    67
    /// Updates the environment variables of the server.
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    68
    pub async fn set_env_vars_os(
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    69
        &mut self,
44693
61fda2dbc522 rust-chg: leverage impl trait at argument position
Yuya Nishihara <yuya@tcha.org>
parents: 44689
diff changeset
    70
        vars: impl IntoIterator<Item = (impl AsRef<OsStr>, impl AsRef<OsStr>)>,
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    71
    ) -> io::Result<()> {
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    72
        self.client
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    73
            .borrow_protocol_mut()
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    74
            .send_command_with_args("setenv", message::pack_env_vars_os(vars))
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    75
            .await
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    76
    }
44675
97e6d435ff7e rust-chg: send client-side environment variables to server
Yuya Nishihara <yuya@tcha.org>
parents: 43818
diff changeset
    77
44684
80d6e3415636 rust-chg: update name of the server process
Yuya Nishihara <yuya@tcha.org>
parents: 44683
diff changeset
    78
    /// Changes the process title of the server.
45620
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    79
    pub async fn set_process_name(
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    80
        &mut self,
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    81
        name: impl AsRef<OsStr>,
426294d06ddc rust: move rustfmt.toml to repo root so it can be used by `hg fix`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44752
diff changeset
    82
    ) -> io::Result<()> {
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    83
        let name_bytes = name.as_ref().as_bytes().to_owned();
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    84
        self.client
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    85
            .borrow_protocol_mut()
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    86
            .send_command_with_args("setprocname", name_bytes)
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    87
            .await
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    88
    }
44684
80d6e3415636 rust-chg: update name of the server process
Yuya Nishihara <yuya@tcha.org>
parents: 44683
diff changeset
    89
44683
065048e66f32 rust-chg: send client side umask to server
Yuya Nishihara <yuya@tcha.org>
parents: 44680
diff changeset
    90
    /// Changes the umask of the server process.
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    91
    pub async fn set_umask(&mut self, mask: u32) -> io::Result<()> {
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    92
        let mut mask_bytes = BytesMut::with_capacity(mem::size_of_val(&mask));
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    93
        mask_bytes.put_u32(mask);
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    94
        self.client
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    95
            .borrow_protocol_mut()
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    96
            .send_command_with_args("setumask2", mask_bytes)
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    97
            .await
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
    98
    }
44683
065048e66f32 rust-chg: send client side umask to server
Yuya Nishihara <yuya@tcha.org>
parents: 44680
diff changeset
    99
39977
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   100
    /// Runs the specified Mercurial command with cHg extension.
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   101
    pub async fn run_command_chg(
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   102
        &mut self,
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   103
        handler: &mut impl SystemHandler,
44693
61fda2dbc522 rust-chg: leverage impl trait at argument position
Yuya Nishihara <yuya@tcha.org>
parents: 44689
diff changeset
   104
        args: impl IntoIterator<Item = impl AsRef<OsStr>>,
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   105
    ) -> io::Result<i32> {
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   106
        runcommand::run_command(
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   107
            self.client.borrow_protocol_mut(),
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   108
            handler,
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   109
            message::pack_args_os(args),
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   110
        )
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   111
        .await
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   112
    }
44680
43513444bb88 rust-chg: add interface to run "validate" request
Yuya Nishihara <yuya@tcha.org>
parents: 44675
diff changeset
   113
43513444bb88 rust-chg: add interface to run "validate" request
Yuya Nishihara <yuya@tcha.org>
parents: 44675
diff changeset
   114
    /// Validates if the server can run Mercurial commands with the expected
43513444bb88 rust-chg: add interface to run "validate" request
Yuya Nishihara <yuya@tcha.org>
parents: 44675
diff changeset
   115
    /// configuration.
43513444bb88 rust-chg: add interface to run "validate" request
Yuya Nishihara <yuya@tcha.org>
parents: 44675
diff changeset
   116
    ///
43513444bb88 rust-chg: add interface to run "validate" request
Yuya Nishihara <yuya@tcha.org>
parents: 44675
diff changeset
   117
    /// The `args` should contain early command arguments such as `--config`
43513444bb88 rust-chg: add interface to run "validate" request
Yuya Nishihara <yuya@tcha.org>
parents: 44675
diff changeset
   118
    /// and `-R`.
43513444bb88 rust-chg: add interface to run "validate" request
Yuya Nishihara <yuya@tcha.org>
parents: 44675
diff changeset
   119
    ///
43513444bb88 rust-chg: add interface to run "validate" request
Yuya Nishihara <yuya@tcha.org>
parents: 44675
diff changeset
   120
    /// Client-side environment must be sent prior to this request, by
43513444bb88 rust-chg: add interface to run "validate" request
Yuya Nishihara <yuya@tcha.org>
parents: 44675
diff changeset
   121
    /// `set_current_dir()` and `set_env_vars_os()`.
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   122
    pub async fn validate(
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   123
        &mut self,
44693
61fda2dbc522 rust-chg: leverage impl trait at argument position
Yuya Nishihara <yuya@tcha.org>
parents: 44689
diff changeset
   124
        args: impl IntoIterator<Item = impl AsRef<OsStr>>,
44752
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   125
    ) -> io::Result<Vec<Instruction>> {
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   126
        let data = self
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   127
            .client
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   128
            .borrow_protocol_mut()
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   129
            .query_with_args("validate", message::pack_args_os(args))
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   130
            .await?;
d6f706929120 rust-chg: reimplement ChgClientExt as ChgClient wrapper
Yuya Nishihara <yuya@tcha.org>
parents: 44737
diff changeset
   131
        message::parse_instructions(data)
44680
43513444bb88 rust-chg: add interface to run "validate" request
Yuya Nishihara <yuya@tcha.org>
parents: 44675
diff changeset
   132
    }
39977
74da9d999cd7 rust-chg: add Client extensions to run cHg-specific requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff changeset
   133
}