Skip to main content

draxl_patch/text/
mod.rs

1mod error;
2mod parse;
3mod resolve;
4mod surface;
5
6use crate::model::PatchOp;
7use draxl_ast::{File, LowerLanguage};
8
9pub use error::PatchTextError;
10pub use surface::{
11    SurfaceDest, SurfaceFragment, SurfaceNodeRef, SurfacePatchOp, SurfacePath, SurfacePathSegment,
12    SurfaceRankedDest, SurfaceSlotOwner, SurfaceSlotRef, SurfaceValue, SurfaceValueKind,
13};
14
15/// Parses canonical textual patch syntax into unresolved surface ops.
16pub fn parse_patch_ops(source: &str) -> Result<Vec<SurfacePatchOp>, PatchTextError> {
17    parse::parse_patch_ops(source)
18}
19
20/// Resolves textual patch ops against the current file into ordinary `PatchOp`s.
21pub fn resolve_patch_ops(file: &File, source: &str) -> Result<Vec<PatchOp>, PatchTextError> {
22    resolve_patch_ops_for_language(LowerLanguage::Rust, file, source)
23}
24
25/// Resolves textual patch ops against the current file into ordinary `PatchOp`s using the selected
26/// lower language.
27pub fn resolve_patch_ops_for_language(
28    language: LowerLanguage,
29    file: &File,
30    source: &str,
31) -> Result<Vec<PatchOp>, PatchTextError> {
32    let surface_ops = parse_patch_ops(source)?;
33    let resolved = resolve::resolve_patch_ops(language, file, source, &surface_ops)?;
34    Ok(resolved.into_iter().map(|op| op.op).collect())
35}
36
37/// Parses, resolves, and applies textual patch ops in order.
38pub fn apply_patch_text(file: &mut File, source: &str) -> Result<(), PatchTextError> {
39    apply_patch_text_for_language(LowerLanguage::Rust, file, source)
40}
41
42/// Parses, resolves, and applies textual patch ops in order using the selected lower language.
43pub fn apply_patch_text_for_language(
44    language: LowerLanguage,
45    file: &mut File,
46    source: &str,
47) -> Result<(), PatchTextError> {
48    let surface_ops = parse_patch_ops(source)?;
49    for surface_op in &surface_ops {
50        let resolved = resolve::resolve_op(language, file, source, surface_op)?;
51        crate::apply_op_for_language(language, file, resolved.op)
52            .map_err(|error| error::patch_text_error(source, resolved.span, &error.message))?;
53    }
54    Ok(())
55}