1
#include "source/common/config/watched_directory.h"
2

            
3
namespace Envoy {
4
namespace Config {
5

            
6
absl::StatusOr<std::unique_ptr<WatchedDirectory>>
7
WatchedDirectory::create(const envoy::config::core::v3::WatchedDirectory& config,
8
35
                         Event::Dispatcher& dispatcher) {
9
35
  absl::Status creation_status = absl::OkStatus();
10
35
  auto ret =
11
35
      std::unique_ptr<WatchedDirectory>(new WatchedDirectory(config, dispatcher, creation_status));
12
35
  RETURN_IF_NOT_OK_REF(creation_status);
13
34
  return ret;
14
35
}
15

            
16
WatchedDirectory::WatchedDirectory(const envoy::config::core::v3::WatchedDirectory& config,
17
35
                                   Event::Dispatcher& dispatcher, absl::Status& creation_status) {
18
35
  watcher_ = dispatcher.createFilesystemWatcher();
19
35
  SET_AND_RETURN_IF_NOT_OK(watcher_->addWatch(absl::StrCat(config.path(), "/"),
20
35
                                              Filesystem::Watcher::Events::MovedTo,
21
35
                                              [this](uint32_t) {
22
                                                // Check if callback is set before invoking to avoid
23
                                                // crash if watch triggers before setCallback().
24
35
                                                if (cb_) {
25
35
                                                  return cb_();
26
35
                                                }
27
35
                                                return absl::OkStatus();
28
35
                                              }),
29
35
                           creation_status);
30
34
}
31

            
32
} // namespace Config
33
} // namespace Envoy