refactory_string

Crates.iorefactory_string
lib.rsrefactory_string
version0.1.4
sourcesrc
created_at2019-12-31 01:04:04.59468
updated_at2019-12-31 22:12:29.668183
descriptionA library to modify a string using original indices. Useful for Source Code transformations.
homepagehttps://github.com/hansl/refactory
repositoryhttps://github.com/hansl/refactory
max_upload_size
id193705
size34,992
Hans Larsen (hansl)

documentation

https://docs.rs/refactory_string

README

RefactoryString

A library to modify a string using original indices, inspired by Rich Harris' MagicString (see here).

Crates.io Downloads GitHub Workflow Status docs.rs rustc ^1.38.0

Buy Me A Coffee


Suppose you have some source code and you want to modify it. If the source code that you're using doesn't have a lossless AST parser and writer, you won't be able to parse it, update it, then save it back. This is where RefactoryString comes in handy; it allows you to modify a text content using its original indices. It is also very fast.

For example, you may want to replace the variable name i with new_var_name in the following code:

let i = 1;
println!("{}", i + 5);

One struggle is to do the transformation in the appropriate order (so you have to queue all changes), and you need to reparse the AST everytime you add something new. With RefactoryString you don't need to worry about it; just overwrite, append or prepend to the left or right of indices in the original string, and serialize to string;

fn do_it() -> Result<(), refactory_string::Error> {
    let example = String::from(r#"let i = 1;\nprintln!("{}", i + 5);"#);
    let mut rs = RefactoryString::new(&example);

    rs.overwrite(4, 5, "new_var_name")?;
    rs.overwrite(27, 28, "new_var_name")?;  // Using indices in the original content.

    assert_eq!(&rs.to_string()?, r#"let new_var_name = 1;\nprintln!("{}", new_var_name + 5);"#);
    Ok(())
}

Documentation

Documentation can be found here and is always improving.

TODO

See our issue list here.

Commit count: 9

cargo fmt