v
Зеркало из https://github.com/vlang/v
1// Copyright (c) 2019-2024 Alexander Medvednikov. All rights reserved.
2// Use of this source code is governed by an MIT license
3// that can be found in the LICENSE file.
4module csv
5
6import strings
7
8struct Writer {
9use_crlf bool
10delimiter u8
11mut:
12sb strings.Builder
13}
14
15@[params]
16pub struct WriterConfig {
17pub:
18use_crlf bool
19delimiter u8 = `,`
20}
21
22// new_writer returns a reference to a Writer
23pub fn new_writer(config WriterConfig) &Writer {
24return &Writer{
25sb: strings.new_builder(200)
26use_crlf: config.use_crlf
27delimiter: config.delimiter
28}
29}
30
31// write writes a single record
32pub fn (mut w Writer) write(record []string) !bool {
33if !valid_delim(w.delimiter) {
34return &InvalidDelimiterError{}
35}
36le := if w.use_crlf { '\r\n' } else { '\n' }
37for n, field_ in record {
38mut field := field_
39if n > 0 {
40w.sb.write_string(w.delimiter.ascii_str())
41}
42if !w.field_needs_quotes(field) {
43w.sb.write_string(field)
44continue
45}
46w.sb.write_string('"')
47for field.len > 0 {
48mut i := field.index_any('"\r\n')
49if i < 0 {
50i = field.len
51}
52w.sb.write_string(field[..i])
53field = field[i..]
54if field.len > 0 {
55z := field[0]
56match z {
57`"` { w.sb.write_string('""') }
58`\r`, `\n` { w.sb.write_string(le) }
59else {}
60}
61field = field[1..]
62}
63}
64w.sb.write_string('"')
65}
66w.sb.write_string(le)
67return true
68}
69
70// Once we have multi dimensional array
71// pub fn (w &Writer) write_all(records [][]string) {
72// for _, record in records {
73// w.write(record)
74// }
75// }
76fn (w &Writer) field_needs_quotes(field string) bool {
77if field == '' {
78return false
79}
80if field.contains(w.delimiter.ascii_str()) || field.index_any('"\r\n') != -1 {
81return true
82}
83return false
84}
85
86// str returns the writer contents
87pub fn (mut w Writer) str() string {
88return w.sb.str()
89}
90