6个版本

0.2.1 2023年11月27日
0.2.0 2023年11月27日
0.1.3 2023年11月26日

Rust模式中排名第1493

每月下载量39
type_reflect中使用

Apache-2.0

11KB
87

TS Quote

Crates.io Documentation

该crate是更大工作空间的一部分,有关详细信息,请参阅monorepo README

该crate提供了一些准引用宏,用于从Rust内部生成TypeScript。

它基于Deno项目,并与Deno的TypeScript表示兼容。

该接口受到流行的quote crate crate用于Rust代码生成的启发。

示例用法

使用ts_string!生成TypeScript字符串

let ts: String = ts_string! { const foo: number = 42; }
// the value of ts is "const foo: number = 42;"

嵌入Rust中的值

也可以嵌入来自Rust的运行时值。

这应该对任何使用quote生成Rust代码的人都很熟悉

let name = "foo";
let value: u32 = 7;

let ts: String = ts_string! { const #name: number = #{value + 1}; }
// the value of ts is "const foo: number = 8;"

可以通过在前面加上#来从Rust中包含值。

要包含一个简单的值,模式#<identifier>将被替换为<identifier>的值。

文字字符串

有时无法将TypeScript语法表示为有效的Rust TokenStream。

例如,如果我们像这样尝试使用ts_string,它将失败

let ts: String = ts_string! { const text = 'some text here'; }
let ts: String = ts_string! { const text = `some other text here`; }

这是因为'some text here'和some other text here不是有效的Rust TokenStream,因此它们会在ts_string进程宏解析它们之前导致编译器错误。

为了解决这个问题,该crate中的宏允许我们直接将字符串文字插入到输出中。

例如,我们可以这样转义上面的例子

let ts: String = ts_string! { const text = #"'some text here'"; }
println!("{}", ts);
let ts: String = ts_string! { const text = #"`some other text here`:"; }
println!("{}", ts);

这将打印

const text = 'some text here';
const text = `some other text here`;

文字字符串中也支持替换,并且原始字符串可以是文字字符串

let t = "text"
let here = "here
let ts: String = ts_string! { const text = r##"'some #t #{here}'"##; }
println!("{}", ts); // prints: const text = 'some text here';

Deno互操作性

为了与Deno兼容,这个库还提供了一个to_quote!宏。这允许创建一个deno_ast::ParsedSource对象

let ts: Result<ParsedSource, deno_ast::Diagnostic> = ts_quote! { const foo = truel; };

此crate还提供了一个方便的TSSource特质,它为ParsedSource(别名TS)实现。

此特质提供了一个格式化的方法

let ts: ParsedSource = ts_quote! { const foo = truel; };
let source: anyhow::Result<Option<String>> = ts.formatted(None);

此方法可选地接受一个dprint_plugin_typescript::configuration::Configuration来控制输出配置。

如果没有提供,将使用通用的默认值进行格式化。

以下是一个使用自定义配置的示例

let ts: ParsedSource = ts_quote! { const foo = truel; };
let config = ConfigurationBuilder::new()
    .indent_width(4)
    .line_width(80)
    .prefer_hanging(true)
    .prefer_single_line(false)
    .quote_style(QuoteStyle::PreferDouble)
    .next_control_flow_position(NextControlFlowPosition::SameLine)
    .build();
let source: anyhow::Result<String> = ts.formatted(Some(config));

上面的示例将转换为以下内容

let ts: ParsedSource = ParsedSource::from_source( "const foo = truel;".to_string() );
let config = ConfigurationBuilder::new()
    .indent_width(4)
    .line_width(80)
    .prefer_hanging(true)
    .prefer_single_line(false)
    .quote_style(QuoteStyle::PreferDouble)
    .next_control_flow_position(NextControlFlowPosition::SameLine)
    .build();
let source: anyhow::Result<String> = ts.formatted(Some(config));

依赖关系

~9.5MB
~221K SLoC