## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  out.width = "100%"
)
library(pizzarr)

has_zarrs <- pizzarr:::.pizzarr_env$zarrs_available
has_s3 <- has_zarrs && ("s3" %in% pizzarr_compiled_features())
has_gcs <- has_zarrs && ("gcs" %in% pizzarr_compiled_features())
has_blosc <- requireNamespace("blosc", quietly = TRUE)

# Each gate probes the service its chunks actually use. Reaching one host says
# nothing about the other, and a gate that opens on the wrong probe fails the
# vignette build rather than skipping it.
reachable <- function(probe_url) {
  tryCatch({
    con <- url(probe_url)
    on.exit(try(close(con), silent = TRUE))
    length(readLines(con, warn = FALSE)) > 0
  }, error = function(e) FALSE, warning = function(w) FALSE)
}

# This vignette sets AWS_ENDPOINT below. Environment variables are
# process-global, and vignettes can share an R session, so stash the incoming
# value and restore it at the end rather than leaking the OSN endpoint into
# whatever builds next.
old_aws_endpoint <- Sys.getenv("AWS_ENDPOINT", unset = NA)

# Every chunk below that touches the network is also gated on reachability,
# so the vignette builds offline.
online <- reachable("https://usgs.osn.mghpcc.org/mdmf/gdp/gridMET.zarr/.zgroup")

# The GCS section reads a different service, so it gets its own probe against
# the same bucket over HTTPS.
gcs_online <- reachable(
  "https://storage.googleapis.com/pangeo-data/ECCO_basins.zarr/.zgroup"
)

## -----------------------------------------------------------------------------
pizzarr_compiled_features()

## ----eval = online------------------------------------------------------------
url <- "https://usgs.osn.mghpcc.org/mdmf/gdp/gridMET.zarr"

store <- HttpStore$new(url)
g <- zarr_open(store)
g

## ----eval = online------------------------------------------------------------
store$listdir()

## ----eval = online && has_blosc-----------------------------------------------
lat <- g$get_item("lat")
lat

lat$get_item(list(slice(1, 5)))$data

## ----eval = online && has_blosc-----------------------------------------------
tmmx <- g$get_item("max_air_temperature")
tmmx

## ----eval = has_s3 && online--------------------------------------------------
# Sys.setenv(AWS_ENDPOINT = "https://usgs.osn.mghpcc.org")
# 
# s3_url <- "s3://mdmf/gdp/gridMET.zarr"
# 
# zarrs_open_array_metadata(s3_url, "lat")

## ----eval = has_s3 && online--------------------------------------------------
# zarrs_get_subset(s3_url, "lat", list(c(0L, 5L)), NULL)

## ----eval = has_s3 && online--------------------------------------------------
# zarrs_close_store(s3_url)

## ----eval = has_gcs && gcs_online---------------------------------------------
# Sys.setenv(GOOGLE_SKIP_SIGNATURE = "true")
# 
# gs_url <- "gs://pangeo-data/ECCO_basins.zarr"
# 
# zarrs_open_array_metadata(gs_url, "basin_mask")$shape

## ----include = FALSE----------------------------------------------------------
if (has_gcs && gcs_online) {
  try(zarrs_close_store("gs://pangeo-data/ECCO_basins.zarr"), silent = TRUE)
}
Sys.unsetenv("GOOGLE_SKIP_SIGNATURE")

## ----include = FALSE----------------------------------------------------------
if (online) try(zarrs_close_store("https://usgs.osn.mghpcc.org/mdmf/gdp/gridMET.zarr"),
                silent = TRUE)

# Restore the endpoint setting; see the note at the top of this vignette.
if (is.na(old_aws_endpoint)) {
  Sys.unsetenv("AWS_ENDPOINT")
} else {
  Sys.setenv(AWS_ENDPOINT = old_aws_endpoint)
}

