6个版本
0.2.1 | 2023年11月27日 |
---|---|
0.2.0 | 2023年11月27日 |
0.1.3 | 2023年11月26日 |
在Rust模式中排名第1493
每月下载量39次
在type_reflect中使用
11KB
87 行
TS Quote
该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