pw_kvs/FlashPartition: Add stream read and write

Add NonSeekableWriter and SeekableReader for FlashPartition.

Change-Id: I643356bdda9a53af6b5d2391f8bd5859bbbfe955
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/84220
Reviewed-by: Armando Montanez <amontanez@google.com>
Reviewed-by: Wyatt Hepler <hepler@google.com>
Commit-Queue: David Rogers <davidrogers@google.com>
diff --git a/pw_kvs/flash_memory.cc b/pw_kvs/flash_memory.cc
index 4f28e07..cc22f67 100644
--- a/pw_kvs/flash_memory.cc
+++ b/pw_kvs/flash_memory.cc
@@ -31,6 +31,40 @@
 
 using std::byte;
 
+Status FlashPartition::Writer::DoWrite(ConstByteSpan data) {
+  if (partition_.size_bytes() <= position_) {
+    return Status::OutOfRange();
+  }
+  if (data.size_bytes() > (partition_.size_bytes() - position_)) {
+    return Status::ResourceExhausted();
+  }
+  if (data.size_bytes() == 0) {
+    return OkStatus();
+  }
+
+  const StatusWithSize sws = partition_.Write(position_, data);
+  if (sws.ok()) {
+    position_ += data.size_bytes();
+  }
+  return sws.status();
+}
+
+StatusWithSize FlashPartition::Reader::DoRead(ByteSpan data) {
+  if (position_ >= partition_.size_bytes()) {
+    return StatusWithSize::OutOfRange();
+  }
+
+  size_t bytes_to_read =
+      std::min(data.size_bytes(), partition_.size_bytes() - position_);
+
+  const StatusWithSize sws =
+      partition_.Read(position_, data.first(bytes_to_read));
+  if (sws.ok()) {
+    position_ += bytes_to_read;
+  }
+  return sws;
+}
+
 StatusWithSize FlashPartition::Output::DoWrite(std::span<const byte> data) {
   PW_TRY_WITH_SIZE(flash_.Write(address_, data));
   address_ += data.size();