首页 > 其他分享 >[Rust] impl TryFrom and try_into()

[Rust] impl TryFrom and try_into()

时间:2024-02-26 15:01:55浏览次数:22  
标签:return into TryFrom value try pwd let Ok

The TryFrom and try_into() methods are part of the. standard libaray's conversion traits, designed to handle conversions between types in a fallible manner - that is, conversions that might fail.

This is in contrast to `From` and `into()` methods, which are used for infallible conversions, where the conversion is guaranteed to succeed. 

Using `TryFrom` and `try_into()` provides several benefits and use cases over other approaches:

 

use anyhow::{Result, anyhow, Context};
use std::path::PathBuf;
use crate::opts::Opts;

#[derive(Debug)]
pub struct Config {
  pub operation: Operation,
  pub pwd: PathBuf,
  pub config: PathBuf,
}

impl TryFrom<Opts> for Config {
  type Error = anyhow::Error;

  fn try_from(value: Opts) -> Result<Self> {
    // when you impl TryFrom, you can use try_into
    let operation = value.args.try_into()?;
    let config = get_config(value.config)?;
    let pwd = get_pwd(value.pwd)?;

    return Ok(Config {
      operation,
      config,
      pwd,
    });
  }
}

#[derive(Debug)]
pub enum Operation {
  Print(Option<String>),
  Add(String, String),
  Remove(String),
}

impl TryFrom<Vec<String>> for Operation {
  type Error = anyhow::Error;

  fn try_from(value: Vec<String>) -> Result<Self> {
    let mut value = value;
    if value.len() == 0 {
      return Ok(Operation::Print(None));
    }

    let term = value.get(0).expect("expect to exist");
    if term == "add" {
      if value.len() != 3 {
        return Err(anyhow!("opearation add expected 2 arguements but got {}", value.len() - 1));
      }

      let mut drain = value.drain(1..=2);
      return Ok(
        Operation::Add(drain.next().expect("to exist"), drain.next().expect("to exist"))
      )
    }

    if term == "Remove" {
      if value.len() != 2 {
        return Err(anyhow!("opearation remove expected 1 arguements but got {}", value.len() - 1));
      }

      let arg = value.pop().expect("to exist");
      return Ok(
        Operation::Remove(arg)
      );
    }

    if value.len() > 1 {
      return Err(anyhow!("operation pritn expects 0 or 1 arguments, but got {}", value.len()));
    }

    let arg = value.pop().expect("to exist");
    return Ok(Operation::Print(Some(arg)));
  }
}

fn get_config(config: Option<PathBuf>) -> Result<PathBuf> {
  if let Some(v) = config {
    return Ok(v);
  }

  let loc = std::env::var("XDG_CONFIG_HOME").context("unable to get XDG_CONFIG_HOME")?;
  let mut loc = PathBuf::from(loc);

  loc.push("projector");
  loc.push("projector.json");

  return Ok(loc);
}

fn get_pwd(pwd: Option<PathBuf>) -> Result<PathBuf> {
  if let Some(pwd) = pwd {
    return Ok(pwd);
  }

  return Ok(std::env::current_dir().context("errored getting current_dir")?)
}

 

标签:return,into,TryFrom,value,try,pwd,let,Ok
From: https://www.cnblogs.com/Answer1215/p/18034352

相关文章

  • Part3: Dive into DDPM
    背景整个系列有相对完整的公式推导,若正文中有涉及到的省略部分,皆额外整理在Part4,并会在正文中会指明具体位置。在Part2基于\(\text{VariationalInference}\),找到原目标函数\(-\ln{p_\theta(x_0)}\)的上界\(L\),定义如下:\[\begin{aligned}L:=&\mathbb{E}_q\left[-\log\frac......
  • FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memo
    <---JSstacktrace--->====JSstacktrace=========================================Securitycontext:000000A526FA5891<JSObject>1:fromString(akafromString)[buffer.js:314][bytecode=0000010AE305A149offset=164](this=00000347695822D1&......
  • [AGC009C] Division into Two
    先假定\(A\leB\),然后先判断无解,如果\(a_{i+2}-a_i<B\),无论怎么分配都是不合法的,直接判掉。然后考虑dp,\(f_i\)表示选了前\(i\)个数,其中第\(i\)个数是归为\(A\)集合的方案数。其中不难发现可转移的状态是一段区间,状态\(f_j\)可以转移仅当\(a_i-a_j\geA\)且\(a_......
  • 遇到Failed to get response from https://registry.npm.taobao.org/vue-cli-version-
    1.问题在启动vueui时,总是遇到报错,如下图:2.解决参考:vuecli创建项目报错:Failedtogetresponsefrom/vue-cli-version-marker找到你的.vuerc文件:C:\Users\trmbh\.vuerc,这里根据自己的用户名更改然后改为{"useTaobaoRegistry":false,"packageManager":"npm"}第......
  • python包管理利器poetry和conda使用简介
     #基本信息 conda相对于主流的虚拟环境管理工具,在python开发环境中最大的特点便是“不需要安装python”。但这并不意味着conda不需要python来运行脚本,而是conda不会依赖于系统中已经存在的python进行运行。因此conda拥有较高的独立性以及强悍的跨版本支持......
  • unpkg 淘宝registry 不能使用的问题
    以前修改过一个unpkg,可以支持本地私服部署,今天有一位网友在使用淘宝registry的时候发现有问题,会有重定向的问题造成不能使用原因分析尽管我们配置的是registry.npmmirror.com但是对于内容的下载npmmirror会使用另外一个域名cdn.npmmirror.com对于npm的tar.gz进行下载......
  • Qt QWindowsWindow::setGeometryDp: Unable to set geometry问题
    总结原因:由于子窗口和父窗口的大小关系不健康,导致父窗口resize失败,失败后会自定义大小解决方法:首先,修改父窗口尺寸,保证其大小可以容纳子部件,可以使用setFixSize()之类的函数修改父窗口尺寸。其次,一定要保证修改父窗口尺寸的函数是放在窗口布局代码之前,如图,我的setIn......
  • Qt 颜色对话框QColorDialog弹出时应用程序输出栏出现QWindowsWindow::setGeometry: Un
    引言在项目中点击按钮,弹出颜色选择对话框,但同时应用程序会在应用程序输出一栏中显示QWindowsWindow::setGeometry:Unabletosetgeometry180x30+345+311(frame:202x86+334+266)onQWidgetWindow/"QColorDialogClassWindow"on"\\.\DISPLAY1".Resultinggeometry:5......
  • npm 报错 npm ERR! request to https://registry.npm.taobao.org/three failed, reaso
    1.问题描述npm使用淘宝镜像安装报错npmERR!codeCERT_HAS_EXPIREDnpmERR!errnoCERT_HAS_EXPIREDnpmERR!requesttohttps://registry.npm.taobao.org/xxxfailed,reason:certificatehasexpired2.错误原因错误提示已经告诉原因是淘宝镜像过期了!其实,早在2021......
  • Hive insert into 竟然覆盖了原来的数据
      本文章向大家介绍Hiveinsertinto竟然覆盖了原来的数据,主要包括Hiveinsertinto竟然覆盖了原来的数据使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。 问题:在使用hive的insertinto往表里插入数据时,却发现原来的数......