Repository: meilisearch/meilisearch
File: dump/src/reader/v4/mod.rs (Rust)

Code before:
impl V4IndexReader {
    pub fn new(name: String, path: &Path, tasks: BufReader<File>) -> Result<Self> {
        let meta = File::open(path.join("meta.json"))?;
        let meta: DumpMeta = serde_json::from_reader(meta)?;

        let mut index_tasks: Vec<Task> = vec![];

        for line in tasks.lines() {
            let task: Task = serde_json::from_str(&line?)?;

            if task.index_uid.to_string() == name {
                index_tasks.push(task)
            }
        }

        let metadata = IndexMetadata {
            uid: name,
            primary_key: meta.primary_key,
            created_at: match index_tasks.first().unwrap().events.first() {
                Some(TaskEvent::Created(ts)) => *ts,
                _ => OffsetDateTime::now_utc(),
            },
            updated_at: match index_tasks.last().unwrap().events.last() {
                Some(TaskEvent::Created(ts)) => *ts,
                _ => OffsetDateTime::now_utc(),
            },
        };

        let ret = V4IndexReader {
            metadata,
            settings: meta.settings.check(),
            documents: BufReader::new(File::open(path.join("documents.jsonl"))?),
        };

        Ok(ret)
    }

    pub fn metadata(&self) -> &IndexMetadata {
        &self.metadata
    }

    pub fn documents(&mut self) -> Result<impl Iterator<Item = Result<Document>> + '_> {
        Ok((&mut self.documents)
            .lines()
            .map(|line| -> Result<_> { Ok(serde_json::from_str(&line?)?) }))
    }

    pub fn settings(&mut self) -> Result<Settings<Checked>> {
        Ok(self.settings.clone())
    }
}

Review comment (suggestion):
```suggestion
            created_at: created_at.unwrap_or(OffsetDateTime::now_utc()),
            updated_at:  updated_at.unwrap_or(OffsetDateTime::now_utc()),
```

Once the previous change are implemented we should be able to do this

Code after:
}

impl V4IndexReader {
    pub fn new(
        name: String,
        path: &Path,
        index_metadata: &IndexMeta,
        tasks: BufReader<File>,
    ) -> Result<Self> {
        let meta = File::open(path.join("meta.json"))?;
        let meta: DumpMeta = serde_json::from_reader(meta)?;

        let mut created_at = None;
        let mut updated_at = None;

        for line in tasks.lines() {
            let task: Task = serde_json::from_str(&line?)?;

            if task.index_uid.to_string() == name {
                if updated_at.is_none() {
                    updated_at = task.updated_at()
                }

                if created_at.is_none() {
                    created_at = task.created_at()
                }

                if task.id as usize == index_metadata.creation_task_id {
                    created_at = task.processed_at();

                    break;
                }
            }
        }

        let metadata = IndexMetadata {
            uid: name,
            primary_key: meta.primary_key,
            created_at: created_at.unwrap_or_else(OffsetDateTime::now_utc),
            updated_at: updated_at.unwrap_or_else(OffsetDateTime::now_utc),
        };

        let ret = V4IndexReader {
            metadata,
            settings: meta.settings.check(),
            documents: BufReader::new(File::open(path.join("documents.jsonl"))?),
        };

        Ok(ret)
    }