1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// FIXME: doctest not running
/// `fileify` takes a string, strips leading and trailing whitespace both for
/// the whole string and for each line, and makes sure that a final newline is
/// present. This serves mostly aesthetic purposes (file contents can be
/// indented):
///
/// ```rs
/// assert_eq!(
/// 	fileify!(
/// 		"
/// 		line 1
/// 		line 2
/// 		"
/// 	),
/// 	"line 1\nline 2\n"
/// );
/// ```
///
/// Overloads allow prefixing and suffixing each line:
///
/// ```rs
/// let file = fileify!("
///     line 1
///     line 2
/// ", "\t");
/// assert_eq!(file, "\tline 1\n\tline 2\n");
///
/// let file = fileify!("
///     line 1
///     line 2
/// ", "\t", ",");
/// assert_eq!(file, "\tline 1,\n\tline 2,\n");
///
/// let file = fileify!("
///     line 1
///     line 2
/// ", "", ",");
/// assert_eq!(file, "line 1,\nline 2,\n");
///
/// ```
#[macro_export]
macro_rules! fileify {
    ($string:expr) => {
        fileify!($string, "", "")
    };

    ($string:expr, $prefix:expr) => {
        fileify!($string, $prefix, "")
    };

    ($string:expr, $prefix:expr, $suffix:expr) => {
        $string
            .trim()
            .lines()
            .fold("".to_string(), |mut file, line| {
                file.push_str($prefix);
                file.push_str(line.trim());
                file.push_str($suffix);
                file.push('\n');
                file
            })
    };
}

#[cfg(test)]
mod tests {
    #[test]
    fn works_plain() {
        let file = fileify!(
            "
			line 1
			line 2
			"
        );
        assert_eq!(file, "line 1\nline 2\n");
    }

    #[test]
    fn works_with_prefix() {
        let file = fileify!(
            "
			line 1
			line 2
			",
            "\t"
        );
        assert_eq!(file, "\tline 1\n\tline 2\n");
    }

    #[test]
    fn works_with_suffix() {
        let file = fileify!(
            "
			line 1
			line 2
			",
            "",
            ";"
        );
        assert_eq!(file, "line 1;\nline 2;\n");
    }

    #[test]
    fn works_with_prefix_and_suffix() {
        let file = fileify!(
            "
			line 1
			line 2
			",
            "\t",
            ";"
        );
        assert_eq!(file, "\tline 1;\n\tline 2;\n");
    }
}