io: add a `cp` function (#9875)
							parent
							
								
									7184629969
								
							
						
					
					
						commit
						00261afbc1
					
				| 
						 | 
					@ -0,0 +1,17 @@
 | 
				
			||||||
 | 
					module io
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						buf_max_len = 5 * 1024
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn cp(dst Writer, src Reader) ? {
 | 
				
			||||||
 | 
						mut buf := read_all(reader: src) or {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						dst.write(buf) or {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						unsafe {
 | 
				
			||||||
 | 
							buf.free()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,43 @@
 | 
				
			||||||
 | 
					import io
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct Buf {
 | 
				
			||||||
 | 
					pub:
 | 
				
			||||||
 | 
						bytes []byte
 | 
				
			||||||
 | 
					mut:
 | 
				
			||||||
 | 
						i int
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct Writ {
 | 
				
			||||||
 | 
					pub mut:
 | 
				
			||||||
 | 
						bytes []byte
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn (mut b Buf) read(mut buf []byte) ?int {
 | 
				
			||||||
 | 
						if !(b.i < b.bytes.len) {
 | 
				
			||||||
 | 
							return none
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						n := copy(buf, b.bytes[b.i..])
 | 
				
			||||||
 | 
						b.i += n
 | 
				
			||||||
 | 
						return n
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn (mut w Writ) write(buf []byte) ?int {
 | 
				
			||||||
 | 
						if buf.len <= 0 {
 | 
				
			||||||
 | 
							return none
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						w.bytes << buf
 | 
				
			||||||
 | 
						return buf.len
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn test_copy() {
 | 
				
			||||||
 | 
						src := Buf{
 | 
				
			||||||
 | 
							bytes: 'abcdefghij'.repeat(10).bytes()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						dst := Writ{
 | 
				
			||||||
 | 
							bytes: []byte{}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						io.cp(dst, src) or {
 | 
				
			||||||
 | 
							assert false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						assert dst.bytes == src.bytes
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue