rewriter 0.2.1

Rust utilities for rewriting files
Documentation
use crate::SpanDefault;
use crate::interface::Span;
use crate::offset_based_rewriter::{self, OffsetBasedRewriter};
use crate::offset_calculator::OffsetCalculator;
use std::{cell::RefCell, rc::Rc};

#[derive(Debug)]
pub struct Rewriter<'original, S: Span = SpanDefault> {
    line_column: S::LineColumn,
    offset_calculator: Rc<RefCell<OffsetCalculator<'original, S>>>,
    offset_based_rewriter: OffsetBasedRewriter<'original>,
}

impl<'original, S: Span> Rewriter<'original, S> {
    #[must_use]
    pub fn new(original: &'original str) -> Self {
        let offset_calculator =
            Rc::new(RefCell::new(OffsetCalculator::new_private(original, false)));
        Self::with_offset_calculator(original, offset_calculator)
    }

    pub fn with_offset_calculator(
        original: &'original str,
        offset_calculator: Rc<RefCell<OffsetCalculator<'original, S>>>,
    ) -> Self {
        Self {
            line_column: S::line_column(1, 0),
            offset_calculator,
            offset_based_rewriter: OffsetBasedRewriter::new(original),
        }
    }

    pub fn contents(self) -> String {
        use offset_based_rewriter::Interface;

        self.offset_based_rewriter.contents()
    }

    pub fn rewrite(&mut self, span: &S, replacement: &str) -> String {
        use offset_based_rewriter::Interface;

        assert!(
            self.line_column <= span.start(),
            "self = {:#?}, span.start() = {:?}, span.end() = {:?}",
            self,
            span.start(),
            span.end(),
        );

        let (start, end) = self.offset_calculator.borrow_mut().offsets_from_span(span);

        let replaced = self.offset_based_rewriter.rewrite(start, end, replacement);

        self.line_column = span.end();

        replaced
    }
}