Skip to content

Commit 58e0c34

Browse files
author
Joshua Nelson
committed
Revert "Crate Details"
This reverts commit d20e4cc.
1 parent 9e415bb commit 58e0c34

File tree

3 files changed

+173
-330
lines changed

3 files changed

+173
-330
lines changed

src/web/crate_details.rs

+68-27
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
use super::error::Nope;
2-
use super::{match_version, redirect_base, render_markdown, MatchSemver, MetaData};
3-
use crate::{db::Pool, impl_webpage, web::page::WebPage};
2+
use super::page::Page;
3+
use super::{
4+
duration_to_str, match_version, redirect_base, render_markdown, MatchSemver, MetaData,
5+
};
6+
use crate::db::Pool;
47
use chrono::{DateTime, NaiveDateTime, Utc};
58
use iron::prelude::*;
69
use iron::{status, Url};
710
use postgres::Connection;
811
use router::Router;
9-
use serde::{ser::Serializer, Serialize};
12+
use serde::{
13+
ser::{SerializeStruct, Serializer},
14+
Serialize,
15+
};
1016
use serde_json::Value;
1117

1218
// TODO: Add target name and versions
1319

14-
#[derive(Debug, Clone, PartialEq, Serialize)]
20+
#[derive(Debug, Clone, PartialEq)]
1521
pub struct CrateDetails {
1622
name: String,
1723
version: String,
@@ -20,9 +26,7 @@ pub struct CrateDetails {
2026
owners: Vec<(String, String)>,
2127
authors_json: Option<Value>,
2228
dependencies: Option<Value>,
23-
#[serde(serialize_with = "optional_markdown")]
2429
readme: Option<String>,
25-
#[serde(serialize_with = "optional_markdown")]
2630
rustdoc: Option<String>, // this is description_long in database
2731
release_time: DateTime<Utc>,
2832
build_status: bool,
@@ -46,16 +50,60 @@ pub struct CrateDetails {
4650
documentation_url: Option<String>,
4751
}
4852

49-
fn optional_markdown<S>(markdown: &Option<String>, serializer: S) -> Result<S::Ok, S::Error>
50-
where
51-
S: Serializer,
52-
{
53-
if let Some(ref markdown) = markdown {
54-
Some(render_markdown(&markdown))
55-
} else {
56-
None
53+
impl Serialize for CrateDetails {
54+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
55+
where
56+
S: Serializer,
57+
{
58+
// Make sure that the length parameter passed to serde is correct by
59+
// adding the someness of `readme` and `rustdoc` to the total. `true`
60+
// is 1 and `false` is 0, so it increments if the value is some (and therefore
61+
// needs to be serialized)
62+
let mut state = serializer.serialize_struct(
63+
"CrateDetails",
64+
26 + self.readme.is_some() as usize + self.rustdoc.is_some() as usize,
65+
)?;
66+
67+
state.serialize_field("metadata", &self.metadata)?;
68+
state.serialize_field("name", &self.name)?;
69+
state.serialize_field("version", &self.version)?;
70+
state.serialize_field("description", &self.description)?;
71+
state.serialize_field("authors", &self.authors)?;
72+
state.serialize_field("owners", &self.owners)?;
73+
state.serialize_field("authors_json", &self.authors_json)?;
74+
state.serialize_field("dependencies", &self.dependencies)?;
75+
76+
if let Some(ref readme) = self.readme {
77+
state.serialize_field("readme", &render_markdown(&readme))?;
78+
}
79+
80+
if let Some(ref rustdoc) = self.rustdoc {
81+
state.serialize_field("rustdoc", &render_markdown(&rustdoc))?;
82+
}
83+
84+
state.serialize_field("release_time", &duration_to_str(self.release_time))?;
85+
state.serialize_field("build_status", &self.build_status)?;
86+
state.serialize_field("last_successful_build", &self.last_successful_build)?;
87+
state.serialize_field("rustdoc_status", &self.rustdoc_status)?;
88+
state.serialize_field("repository_url", &self.repository_url)?;
89+
state.serialize_field("homepage_url", &self.homepage_url)?;
90+
state.serialize_field("keywords", &self.keywords)?;
91+
state.serialize_field("have_examples", &self.have_examples)?;
92+
state.serialize_field("target_name", &self.target_name)?;
93+
state.serialize_field("releases", &self.releases)?;
94+
state.serialize_field("github", &self.github)?;
95+
state.serialize_field("github_stars", &self.github_stars)?;
96+
state.serialize_field("github_forks", &self.github_forks)?;
97+
state.serialize_field("github_issues", &self.github_issues)?;
98+
state.serialize_field("metadata", &self.metadata)?;
99+
state.serialize_field("is_library", &self.is_library)?;
100+
state.serialize_field("doc_targets", &self.doc_targets)?;
101+
state.serialize_field("yanked", &self.yanked)?;
102+
state.serialize_field("license", &self.license)?;
103+
state.serialize_field("documentation_url", &self.documentation_url)?;
104+
105+
state.end()
57106
}
58-
.serialize(serializer)
59107
}
60108

61109
#[derive(Debug, Clone, Eq, PartialEq, Serialize)]
@@ -305,15 +353,6 @@ fn map_to_release(conn: &Connection, crate_id: i32, version: String) -> Release
305353
}
306354
}
307355

308-
#[derive(Debug, Clone, PartialEq, Serialize)]
309-
struct CrateDetailsPage {
310-
details: Option<CrateDetails>,
311-
}
312-
313-
impl_webpage! {
314-
CrateDetailsPage = "crate/details.html",
315-
}
316-
317356
pub fn crate_details_handler(req: &mut Request) -> IronResult<Response> {
318357
let router = extension!(req, Router);
319358
// this handler must always called with a crate name
@@ -326,9 +365,12 @@ pub fn crate_details_handler(req: &mut Request) -> IronResult<Response> {
326365
Some(MatchSemver::Exact((version, _))) => {
327366
let details = CrateDetails::new(&conn, &name, &version);
328367

329-
CrateDetailsPage { details }.into_response(req)
368+
Page::new(details)
369+
.set_true("show_package_navigation")
370+
.set_true("javascript_highlightjs")
371+
.set_true("package_navigation_crate_tab")
372+
.to_resp("crate_details")
330373
}
331-
332374
Some(MatchSemver::Semver((version, _))) => {
333375
let url = ctry!(
334376
req,
@@ -342,7 +384,6 @@ pub fn crate_details_handler(req: &mut Request) -> IronResult<Response> {
342384

343385
Ok(super::redirect(url))
344386
}
345-
346387
None => Err(IronError::new(Nope::CrateNotFound, status::NotFound)),
347388
}
348389
}

templates/crate_details.hbs

+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
{{> header}}
2+
3+
4+
{{#with content}}
5+
<div class="container package-page-container">
6+
<div class="pure-g">
7+
<div class="pure-u-1 pure-u-sm-7-24 pure-u-md-5-24">
8+
<div class="pure-menu package-menu">
9+
<ul class="pure-menu-list">
10+
<li class="pure-menu-heading">Authors</li>
11+
{{#each authors}}
12+
<li class="pure-menu-item"><a href="/releases/{{this.[1]}}" class="pure-menu-link">{{this.[0]}}</a></li>
13+
{{/each}}
14+
<li class="pure-menu-heading">Links</li>
15+
{{#if homepage_url}}<li class="pure-menu-item"><a href="{{homepage_url}}" class="pure-menu-link"><i class="fa fa-home fa-fw"></i> Homepage</a></li>{{/if}}
16+
{{#if documentation_url}}<li class="pure-menu-item"><a href="{{documentation_url}}" title="Canonical documentation" class="pure-menu-link"><i class="fa fa-fw fa-file-text"></i> Documentation</a></li>{{/if}}
17+
{{#if github}}
18+
<li class="pure-menu-item">
19+
<a href="{{repository_url}}" class="pure-menu-link"><i class="fa fa-github fa-fw"></i> <i class="fa fa-star-o fa-fw"></i> {{github_stars}} <i class="fa fa-code-fork fa-fw"></i> {{github_forks}} <i class="fa fa-exclamation-circle fa-fw"></i> {{github_issues}}</a>
20+
</li>
21+
{{else}}
22+
{{#if repository_url}}<li class="pure-menu-item"><a href="{{repository_url}}" class="pure-menu-link"><i class="fa fa-code-fork fa-fw"></i> Repository</a></li>{{/if}}
23+
{{/if}}
24+
<li class="pure-menu-item"><a href="https://crates.io/crates/{{name}}" class="pure-menu-link" title="See {{name}} in crates.io"><i class="fa fa-cube fa-fw"></i> Crates.io</a></li>
25+
<li class="pure-menu-heading">Dependencies</li>
26+
<li class="pure-menu-item">
27+
<div class="pure-menu pure-menu-scrollable sub-menu">
28+
<ul class="pure-menu-list">
29+
{{#each dependencies}}
30+
<li class="pure-menu-item">
31+
<a href="/crate/{{this.[0]}}/{{this.[1]}}"
32+
class="pure-menu-link">
33+
{{this.[0]}} {{this.[1]}}
34+
<i class="dependencies {{this.[2]}}">{{this.[2]}}</i>
35+
</a>
36+
</li>
37+
{{/each}}
38+
</ul>
39+
</div>
40+
</li>
41+
<li class="pure-menu-heading">Versions</li>
42+
<li class="pure-menu-item">
43+
<div class="pure-menu pure-menu-scrollable sub-menu">
44+
<ul class="pure-menu-list">
45+
{{#each releases}}
46+
<li class="pure-menu-item">
47+
{{#if this.yanked}}
48+
{{#if this.build_status}}
49+
<a href="/crate/{{../name}}/{{this.version}}" class="pure-menu-link warn" title="{{../name}}-{{this.version}} is yanked"><i class="fa fa-fw fa-warning"></i> {{this.version}}</a>
50+
{{else}}
51+
<a href="/crate/{{../name}}/{{this.version}}" class="pure-menu-link warn" title="{{../name}}-{{this.version}} is yanked and docs.rs failed to build it"><i class="fa fa-fw fa-warning"></i> {{this.version}}</a>
52+
{{/if}}
53+
{{else}}
54+
{{#if this.build_status}}
55+
<a href="/crate/{{../name}}/{{this.version}}" class="pure-menu-link">{{this.version}}</a>
56+
{{else}}
57+
<a href="/crate/{{../name}}/{{this.version}}" class="pure-menu-link warn" title="docs.rs failed to build {{../name}}-{{this.version}}"><i class="fa fa-fw fa-warning"></i> {{this.version}}</a>
58+
{{/if}}
59+
{{/if}}
60+
</li>
61+
{{/each}}
62+
</ul>
63+
</div>
64+
</li>
65+
<li class="pure-menu-heading">Owners</li>
66+
<li class="pure-menu-item">
67+
{{#each owners}}
68+
<a href="/releases/@{{this.[0]}}"><img src="{{this.[1]}}" alt="{{this.[0]}}" class="owner"></a>
69+
{{/each}}
70+
</li>
71+
</ul>
72+
</div>
73+
</div>
74+
<div class="pure-u-1 pure-u-sm-17-24 pure-u-md-19-24 package-details" id="main">
75+
{{#unless is_library}}
76+
<div class="warning">{{name}}-{{version}} is not a library.</div>
77+
{{else}}
78+
{{#if yanked}}
79+
<div class="warning">{{name}}-{{version}} has been yanked.</div>
80+
{{else}}
81+
{{#unless build_status}}
82+
<div class="warning">docs.rs failed to build {{name}}-{{version}}<br>Please check the <a href="/crate/{{name}}/{{version}}/builds">build logs</a> and, if you believe this is docs.rs' fault, <a href="https://github.com/rust-lang/docs.rs/issues/new/choose">open an issue</a>.</div>
83+
{{#if last_successful_build}}
84+
<div class="info">Visit the last successful build: <a href="/crate/{{name}}/{{last_successful_build}}">{{name}}-{{last_successful_build}}</a></div>
85+
{{/if}}
86+
{{else}}
87+
{{#unless rustdoc_status}}
88+
<div class="warning">{{name}}-{{version}} doesn't have any documentation.</div>
89+
{{/unless}}
90+
{{/unless}}
91+
{{/if}}
92+
{{/unless}}
93+
{{#if readme}}
94+
{{{readme}}}
95+
{{else}}
96+
{{{rustdoc}}}
97+
{{/if}}
98+
</div>
99+
</div>
100+
101+
</div>
102+
{{/with}}
103+
104+
105+
{{> footer}}

0 commit comments

Comments
 (0)