diff options
Diffstat (limited to 'bin')
-rw-r--r-- | bin/Cargo.toml | 12 | ||||
-rw-r--r-- | bin/src/traits.rs | 45 |
2 files changed, 55 insertions, 2 deletions
diff --git a/bin/Cargo.toml b/bin/Cargo.toml index af5a288..528f804 100644 --- a/bin/Cargo.toml +++ b/bin/Cargo.toml | |||
@@ -14,3 +14,15 @@ thiserror = "1.0.30" | |||
14 | similar = "2.1.0" | 14 | similar = "2.1.0" |
15 | vfs = { path = "../vfs" } | 15 | vfs = { path = "../vfs" } |
16 | lib = { path = "../lib" } | 16 | lib = { path = "../lib" } |
17 | |||
18 | [dependencies.serde_json] | ||
19 | version = "1.0.68" | ||
20 | optional = true | ||
21 | |||
22 | [dependencies.serde] | ||
23 | version = "1.0.68" | ||
24 | features = [ "derive" ] | ||
25 | optional = true | ||
26 | |||
27 | [features] | ||
28 | json = [ "lib/json-out", "serde_json", "serde" ] | ||
diff --git a/bin/src/traits.rs b/bin/src/traits.rs index 5cf7208..a0e40d4 100644 --- a/bin/src/traits.rs +++ b/bin/src/traits.rs | |||
@@ -32,9 +32,10 @@ where | |||
32 | format: OutFormat, | 32 | format: OutFormat, |
33 | ) -> io::Result<()> { | 33 | ) -> io::Result<()> { |
34 | match format { | 34 | match format { |
35 | #[cfg(feature = "json")] | ||
36 | OutFormat::Json => json::write_json(self, lint_result, vfs), | ||
35 | OutFormat::StdErr => write_stderr(self, lint_result, vfs), | 37 | OutFormat::StdErr => write_stderr(self, lint_result, vfs), |
36 | OutFormat::Errfmt => write_errfmt(self, lint_result, vfs), | 38 | OutFormat::Errfmt => write_errfmt(self, lint_result, vfs), |
37 | _ => Ok(()), | ||
38 | } | 39 | } |
39 | } | 40 | } |
40 | } | 41 | } |
@@ -84,7 +85,11 @@ fn write_stderr<T: Write>( | |||
84 | Ok(()) | 85 | Ok(()) |
85 | } | 86 | } |
86 | 87 | ||
87 | fn write_errfmt<T: Write>(writer: &mut T, lint_result: &LintResult, vfs: &ReadOnlyVfs) -> io::Result<()> { | 88 | fn write_errfmt<T: Write>( |
89 | writer: &mut T, | ||
90 | lint_result: &LintResult, | ||
91 | vfs: &ReadOnlyVfs, | ||
92 | ) -> io::Result<()> { | ||
88 | let file_id = lint_result.file_id; | 93 | let file_id = lint_result.file_id; |
89 | let src = str::from_utf8(vfs.get(file_id)).unwrap(); | 94 | let src = str::from_utf8(vfs.get(file_id)).unwrap(); |
90 | let path = vfs.file_path(file_id); | 95 | let path = vfs.file_path(file_id); |
@@ -107,6 +112,42 @@ fn write_errfmt<T: Write>(writer: &mut T, lint_result: &LintResult, vfs: &ReadOn | |||
107 | Ok(()) | 112 | Ok(()) |
108 | } | 113 | } |
109 | 114 | ||
115 | #[cfg(feature = "json")] | ||
116 | mod json { | ||
117 | use crate::lint::LintResult; | ||
118 | use std::io::{self, Write}; | ||
119 | use vfs::ReadOnlyVfs; | ||
120 | |||
121 | use lib::Report; | ||
122 | use serde::Serialize; | ||
123 | use serde_json; | ||
124 | |||
125 | #[derive(Serialize)] | ||
126 | struct JsonReport<'μ> { | ||
127 | file: &'μ std::path::Path, | ||
128 | report: Vec<&'μ Report>, | ||
129 | } | ||
130 | |||
131 | pub fn write_json<T: Write>( | ||
132 | writer: &mut T, | ||
133 | lint_result: &LintResult, | ||
134 | vfs: &ReadOnlyVfs, | ||
135 | ) -> io::Result<()> { | ||
136 | let file_id = lint_result.file_id; | ||
137 | let path = vfs.file_path(file_id); | ||
138 | writeln!( | ||
139 | writer, | ||
140 | "{}", | ||
141 | serde_json::to_string_pretty(&JsonReport { | ||
142 | file: path, | ||
143 | report: lint_result.reports.iter().collect::<Vec<_>>() | ||
144 | }) | ||
145 | .unwrap() | ||
146 | )?; | ||
147 | Ok(()) | ||
148 | } | ||
149 | } | ||
150 | |||
110 | fn line(at: TextRange, src: &str) -> usize { | 151 | fn line(at: TextRange, src: &str) -> usize { |
111 | let at = at.start().into(); | 152 | let at = at.start().into(); |
112 | src[..at].chars().filter(|&c| c == '\n').count() + 1 | 153 | src[..at].chars().filter(|&c| c == '\n').count() + 1 |