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
15pub fn parse_patch_ops(source: &str) -> Result<Vec<SurfacePatchOp>, PatchTextError> {
17 parse::parse_patch_ops(source)
18}
19
20pub fn resolve_patch_ops(file: &File, source: &str) -> Result<Vec<PatchOp>, PatchTextError> {
22 resolve_patch_ops_for_language(LowerLanguage::Rust, file, source)
23}
24
25pub 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
37pub fn apply_patch_text(file: &mut File, source: &str) -> Result<(), PatchTextError> {
39 apply_patch_text_for_language(LowerLanguage::Rust, file, source)
40}
41
42pub 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}