diff --git a/tests/test_encoder.py b/tests/test_encoder.py index 7f59f25..c9d5643 100644 --- a/tests/test_encoder.py +++ b/tests/test_encoder.py @@ -88,6 +88,17 @@ def test_encode_primitive_array(): result = encode(data) assert result == 'items: [hello,"world, test",foo]' +def test_encode_tuple_array(): + """Test encoding of primitive arrays.""" + # Number tuple + assert encode({'numbers': (1, 2, 3)}) == 'numbers: [1,2,3]' + + # String tuple + assert encode({'names': ('Alice', 'Bob')}) == 'names: [Alice,Bob]' + + # Mixed primitive tuple + assert encode({'mixed': (1, 'text', True, None)}) == 'mixed: [1,text,true,null]' + def test_encode_array_delimiter(): """Test different array delimiters.""" diff --git a/toon/encoder.py b/toon/encoder.py index 6e1206c..05c410a 100644 --- a/toon/encoder.py +++ b/toon/encoder.py @@ -117,9 +117,11 @@ def _encode_value(value: Any, level: int, opts: EncoderOptions) -> str: return _encode_array(value, level, opts) elif isinstance(value, dict): return _encode_object(value, level, opts) + elif isinstance(value, tuple): + return _encode_tuple(value) else: - # Handle other types as null - return 'null' + # Handle other types with NotImplementedError + raise NotImplementedError(f'Encoding for type {type(value)} is not implemented.') def _encode_object(obj: dict, level: int, opts: EncoderOptions) -> str: @@ -177,6 +179,16 @@ def _encode_array(arr: list, level: int, opts: EncoderOptions) -> str: # Mixed array (list format) return _encode_list_array(arr, level, opts, key=None) +def _encode_tuple(value: tuple) -> str: + """Encode a tuple.""" + if not value: + return '[]' + + tuple_data = ','.join(_encode_primitive_value(v) for v in value) + tuple_string = f'[{tuple_data}]' + + return tuple_string + def _encode_array_with_key(key: str, arr: list, level: int, opts: EncoderOptions) -> str: """Encode an array with its key prefix for object context."""