diff --git a/src/file.lua b/src/file.lua index 2ac840f..372d49b 100644 --- a/src/file.lua +++ b/src/file.lua @@ -15,6 +15,50 @@ function start_reading(fs, filename) } end +-- fake file object with the same 'shape' as that returned by start_reading +function fake_file_stream(s) + local i = 1 + local max = string.len(s) + return { + read = function(format) + if i > max then + return nil + end + if type(format) == 'number' then + local result = s:sub(i, i+format-1) + i = i+format + return result + elseif format == '*a' then + local result = s:sub(i) + i = max+1 + return result + elseif format == '*l' then + local start = i + while i <= max do + if s:sub(i, i) == '\n' then + break + end + i = i+1 + end + local result = s:sub(start, i) + i = i+1 + return result + elseif format == '*n' then + error('fake file streams: *n not yet supported') + end + end, + } +end + +function test_fake_file_system() + local s = fake_file_stream('abcdefgh\nijk\nlmn') + check_eq(s.read(1), 'a', 'fake_file_system: 1 char') + check_eq(s.read(1), 'b', 'fake_file_system: 1 more char') + check_eq(s.read(3), 'cde', 'fake_file_system: multiple chars') + check_eq(s.read('*l'), 'fgh\n', 'fake_file_system: line') + check_eq(s.read('*a'), 'ijk\nlmn', 'fake_file_system: all') +end + -- primitive for writing files to a file system (or, later, network) -- returns an object or nil on error -- write to the object using .write()