fs
Module
Module containing functions for interacting with the filesystem.
File
trait FileTrait {
fn new(path: ByteArray) -> File;
}
FileParser<T>
trait FileParser<T, +Serde<T>> {
fn parse_txt(file: @File) -> Option<T>;
fn parse_json(file: @File) -> Option<T>;
}
read_txt
& read_json
fn read_txt(file: @File) -> Array<felt252>;
fn read_json(file: @File) -> Array<felt252>;
File format
Some rules have to be checked when providing a file for snforge, in order for correct parsing behavior. Different ones apply for JSON and plain text files.
Plain text files
- Elements have to be separated with newlines
- Elements have to be either:
- integers in range of
[0, P)
where P isCairo Prime
either in decimal or0x
prefixed hex format - single line short strings (
felt252
) of length<=31
surrounded by''
i.e.,'short string'
, new lines can be used with\n
and'
with\'
- single line strings (
ByteArray
) surrounded by""
i.e.,"very very very very loooooong string"
, new lines can be used with\n
and"
with\"
- integers in range of
JSON files
- Elements have to be either:
- integers in range of
[0, P)
where P isCairo Prime
- single line strings (
ByteArray
) i.e."very very very very loooooong string"
, new lines can be used with\n
and"
with\"
- array of integers or strings fulfilling the above conditions
- integers in range of
⚠️ Warning
A JSON object is an unordered data structure. To make reading JSONs deterministic, the values are read from the JSON in an order that is alphabetical in respect to JSON keys. Nested JSON values are sorted by the flattened format keys
(a.b.c)
.
Example
For example, this plain text file content:
1
2
'hello'
10
"world"
or this JSON file content:
{
"a": 1,
"nested": {
"b": 2,
"c": 448378203247
},
"d": 10,
"e": "world"
}
(note that short strings cannot be used in JSON file)
could be parsed to the following struct in cairo, via parse_txt
/parse_json
:
A {
a: 1,
nested: B {
b: 2,
c: 'hello',
},
d: 10,
e: "world"
}
or to an array, via read_txt
/read_json
:
array![1, 2, 'hello', 10, 0, 512970878052, 5]