fcb_core 0.7.6

FlatCityBuf is a library for reading and writing CityJSON with FlatBuffers. Contains code derived from FlatGeobuf (BSD-2-Clause) for spatial indexing.
Documentation
use fcb_core::{
    attribute::{AttributeSchema, AttributeSchemaMethods},
    header_writer::HeaderWriterOptions,
    read_cityjson_from_reader, CJType, CJTypeKind, CityJSONSeq, FcbWriter,
};
use std::error::Error;
use std::fs::File;
use std::io::{BufReader, BufWriter};
use std::path::PathBuf;

fn write_file() -> Result<(), Box<dyn Error>> {
    let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
    let input_file = manifest_dir
        .join("tests")
        .join("data")
        .join("small.city.jsonl");
    let output_file = manifest_dir.join("temp").join("test_output.fcb");
    let input_file = File::open(input_file)?;
    let inputreader = BufReader::new(input_file);
    let cj_seq = read_cityjson_from_reader(inputreader, CJTypeKind::Seq)?;
    if let CJType::Seq(cj_seq) = cj_seq {
        let CityJSONSeq { cj, features } = cj_seq;

        let output_file = File::create(output_file)?;
        let outputwriter = BufWriter::new(output_file);

        let attr_indices = vec![
            ("b3_h_dak_50p".to_string(), None),
            ("identificatie".to_string(), None),
        ];
        let header_options = Some(HeaderWriterOptions {
            write_index: false,
            feature_count: features.len() as u64,
            index_node_size: 16,
            attribute_indices: Some(attr_indices),
            geographical_extent: None,
        });
        let mut attr_schema = AttributeSchema::new();
        for feature in features.iter() {
            for (_, co) in feature.city_objects.iter() {
                if let Some(attributes) = &co.attributes {
                    attr_schema.add_attributes(attributes);
                }
            }
        }
        let mut fcb = FcbWriter::new(cj, header_options, Some(attr_schema), None)?;
        for feature in features.iter() {
            fcb.add_feature(feature)?;
        }
        fcb.write(outputwriter)?;
    }

    Ok(())
}

fn main() {
    write_file().unwrap();
}